在一个查询中选择日期和所有时间计数之间的计数 Postgres DB

问题描述

我还想选择日期之间的展示次数和所有时间展示次数,我们可以在一个查询中完成吗?

这是我的查询,我只能在日期之间获得印象

SELECT
    robotAds."Ad_ID",count(robotScraper."adIDAdID") as ad_impression
FROM
    robot__ads robotAds
LEFT JOIN robot__session__scraper__data robotScraper 
    ON robotScraper."adIDAdID" = robotAds."Ad_ID"
LEFT JOIN robot__session_data robotSession 
    ON robotSession."id" = robotScraper."sessionIDId"
    AND robotSession."Session_start" BETWEEN '2020-11-25 00:00:00'
    AND '2021-04-01 00:00:00'
GROUP BY
    robotAds."Ad_ID"

我必须做什么才能在同一查询中获得所有时间印象数。

谢谢

解决方法

是的,你可以:

SELECT
    robotAds."Ad_ID",count(robotScraper."adIDAdID") filter (where robotSession."Session_start" BETWEEN '2020-11-25 00:00:00'AND '2021-04-01 00:00:00') as ad_impression,count(robotScraper."adIDAdID") count_alltime
FROM
    robot__ads robotAds
LEFT JOIN robot__session__scraper__data robotScraper 
    ON robotScraper."adIDAdID" = robotAds."Ad_ID"
LEFT JOIN robot__session_data robotSession 
    ON robotSession."id" = robotScraper."sessionIDId"
     
GROUP BY
    robotAds."Ad_ID"
,

“条件聚合”应该可以满足这个需求。本质上,这是在聚合函数中使用 case 表达式,如下所示:

SELECT
      robotAds."Ad_ID",count(CASE 
            WHEN robotSession."Session_start" BETWEEN '2020-11-25 00:00:00'
                    AND '2021-04-01 00:00:00'
                THEN 1
            END)                     AS range_ad_impression,count(robotScraper."adIDAdID") AS all_ad_impression
FROM robot__ads robotAds
LEFT JOIN robot__session__scraper__data robotScraper ON robotScraper."adIDAdID" = robotAds."Ad_ID"
LEFT JOIN robot__session_data robotSession ON robotSession."id" = robotScraper."sessionIDId"
GROUP BY robotAds."Ad_ID"

注意:count() 函数忽略 NULL,上面我省略了返回 NULL 的显式指令,但有些人更喜欢使用 else

,count(CASE 
        WHEN robotSession."Session_start" BETWEEN '2020-11-25 00:00:00'
                AND '2021-04-01 00:00:00'
            THEN 1 ELSE NULL
        END) AS range_count