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

Select count between dates & All time counts in one query Postgres DB

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

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

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"

我必须执行哪些操作才能计算同一查询中所有时间的展示次数。

谢谢

“条件聚合”应该可以满足这个需求。本质上这是在聚合函数中使用 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,上面我省略了对 return 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

是的,你可以:

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"