СУММА Postgres за заданное время

#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