#sql #postgresql #datetime #sum #aggregate-functions
#sql #postgresql #дата и время #сумма #агрегатные функции
Вопрос:
Я пытаюсь СУММИРОВАТЬ данные Google Analytics за заданное время, используя Postgres. Я не совсем уверен, как обойти проблему группировки. Запрос, который вы видите ниже, возвращает один столбец в день. Я хочу СУММИРОВАТЬ все клики за заданные даты. Таким образом, запрос должен возвращать 1 строку для каждой кампании со столбцом в каждой строке, указывающим сумму кликов.
SELECT
sa.id AS salesforce_account_id,
acp.campaignid,
acp.campaignname,
date,
SUM(clicks) as clicks
FROM
adwords_campaign_performance acp
INNER JOIN salesforce_account sa ON
sa.adwords_id = acp.adwords_customerid
WHERE acp.date >= '2020-10-01'
AND acp.date <= '2020-10-03'
GROUP BY sa.id, acp.campaignid, acp.campaignname, date
Я могу написать запрос так, чтобы он возвращал число за весь месяц, как показано ниже:
SELECT
sa.id AS salesforce_account_id,
acp.campaignid,
acp.campaignname,
date_trunc('month', date) AS MONTH,
SUM(clicks) as clicks
FROM
adwords_campaign_performance acp
INNER JOIN salesforce_account sa ON
sa.adwords_id = acp.adwords_customerid
WHERE MONTH = '2020-10-01 00:00:00'
AND sa.id = 3148
GROUP BY sa.id, acp.campaignid, acp.campaignname, MONTH
Любая помощь будет с благодарностью принята. Спасибо!
Ответ №1:
Запрос, который вы видите ниже, возвращает один столбец в день. Я хочу СУММИРОВАТЬ все клики за заданные даты. Таким образом, запрос должен возвращать 1 строку для каждой кампании со столбцом в каждой строке, указывающим сумму кликов.
Поэтому просто удалите date
из select
group by
предложений and:
SELECT
sa.id AS salesforce_account_id,
acp.campaignid,
acp.campaignname,
SUM(clicks) as clicks
FROM adwords_campaign_performance acp
INNER JOIN salesforce_account sa ON sa.adwords_id = acp.adwords_customerid
WHERE acp.date >= '2020-10-01'
AND acp.date <= '2020-10-03'
GROUP BY sa.id, acp.campaignid, acp.campaignname
Ответ №2:
Я думаю, вы хотите generate_series()
сгенерировать все дни месяца:
SELECT gs.date, sa.id AS salesforce_account_id, acp.campaignid, acp.campaignname,
SUM(clicks) as clicks
FROM generate_series('2020-10-01'::date, '2020-10-31'::date, interval '1 day') gs(dte) LEFT JOIN
adwords_campaign_performance acp
ON acp.date >= gs.dte AND
acp.date < gs.dte INTERVAL '1 DAY' LEFT JOIN
salesforce_account sa
ON sa.adwords_id = acp.adwords_customerid
GROUP BY gs.dte, sa.id, acp.campaignid, acp.campaignname, date