【问题标题】:PostgreSQL aggregation with missing dates缺少日期的 PostgreSQL 聚合
【发布时间】:2015-08-03 10:44:55
【问题描述】:

我正在尝试这个查询

SELECT date_trunc('day', commit_at) AS day, count(*)
  FROM commits
  GROUP BY date_trunc('day', commit_at)
  ORDER BY date_trunc('day', commit_at) ASC;

然后它返回

      day         | count 
---------------------+-------
2015-05-18 00:00:00 |     5
2015-05-19 00:00:00 |     2
2015-05-21 00:00:00 |     2
(3 lignes)

问题是:我怎样才能强制空天出现在结果中?

      day         | count 
---------------------+-------
2015-05-18 00:00:00 |     5
2015-05-19 00:00:00 |     2
2015-05-20 00:00:00 |     0
2015-05-21 00:00:00 |     2
(3 lignes)

【问题讨论】:

  • SQL 无法从无到有创建数据。您要么必须有一个带有日期的系统,要么使用一种方法来创建这些日期以加入或联合。例如,返回日期范围之间的所有日期的递归 CTE。回到这个集合,这样你就可以得到所有的日期。这是一种方法:stackoverflow.com/questions/13100445/… 看看@a_horse_with_no_name 如何提供答案或 erwin 的...
  • 好的,所以想法是在第一个日期和最后一个日期之间generate_series 然后查询这些日期?我试过了,但如果有人有例子,我就无法工作
  • 查看第一条评论中的链接,提供了示例,是的,Erwin 使用generate_series

标签: sql postgresql select aggregate-functions


【解决方案1】:

这样做的一种方法是使用 nu generate_series 生成介于最小日期和最大日期之间的所有天数,然后将其加入聚合查询:

SELECT    DATE_TRUNC ('day', 
                      GENERATE_SERIES (MIN(commit_at), MAX(commit_at), '1 day') 
             AS day, 
          COALESCE (cnt, 0)
FROM      commits
LEFT JOIN (SELECT   DATE_TRUNC('day', commit_at) AS cday
           FROM     commits
           GROUP BY DATE_TRUNC('day', commit_at)) agg ON day = cday
ORDER BY  1 ASC

【讨论】:

    猜你喜欢
    • 2011-07-31
    • 1970-01-01
    • 2021-10-25
    • 2012-10-27
    • 1970-01-01
    • 2021-10-10
    • 2020-09-16
    • 2018-10-01
    • 2017-12-10
    相关资源
    最近更新 更多