缺少日期的 PostgreSQL 聚合

m4t*_*m4t 4 sql postgresql select aggregate-functions

我正在尝试这个查询

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;
Run Code Online (Sandbox Code Playgroud)

它返回

      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)
Run Code Online (Sandbox Code Playgroud)

问题是:我如何才能强制将空天数包含在结果中?

      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)
Run Code Online (Sandbox Code Playgroud)

Mur*_*nik 5

一种方法是使用 nugenerate_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
Run Code Online (Sandbox Code Playgroud)