缺少日期的 PostgreSQL 聚合
Posted
技术标签:
【中文标题】缺少日期的 PostgreSQL 聚合【英文标题】:PostgreSQL aggregation with missing dates 【发布时间】: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。回到这个集合,这样你就可以得到所有的日期。这是一种方法:***.com/questions/13100445/… 看看@a_horse_with_no_name 如何提供答案或 erwin 的... 好的,所以想法是在第一个日期和最后一个日期之间generate_series
然后查询这些日期?我试过了,但如果有人有例子,我就无法工作
查看第一条评论中的链接,提供了示例,是的,Erwin 使用generate_series
【参考方案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
【讨论】:
以上是关于缺少日期的 PostgreSQL 聚合的主要内容,如果未能解决你的问题,请参考以下文章