Joh*_*ith 3 sql postgresql aggregate-functions generate-series
假设我有一个这样的搜索查询:
SELECT COUNT(id), date(created_at)
FROM entries
WHERE date(created_at) >= date(current_date - interval '1 week')
GROUP BY date(created_at)
Run Code Online (Sandbox Code Playgroud)
如您所知,例如我得到的结果如下:
count | date
2 | 15.01.2014
1 | 13.01.2014
9 | 09.01.2014
Run Code Online (Sandbox Code Playgroud)
但我没有得到一周中没有创建条目的日子。
如何获得如下所示的搜索结果,包括没有创建条目的日期?
count | date
2 | 15.01.2014
0 | 14.01.2014
1 | 13.01.2014
0 | 12.01.2014
0 | 11.01.2014
0 | 10.01.2014
9 | 09.01.2014
Run Code Online (Sandbox Code Playgroud)
SELECT day, COALESCE(ct, 0) AS ct
FROM (SELECT now()::date - d AS day FROM generate_series (0, 6) d) d -- 6, not 7
LEFT JOIN (
SELECT created_at::date AS day, count(*) AS ct
FROM entries
WHERE created_at >= date_trunc('day', now()) - interval '6d'
GROUP BY 1
) e USING (day);
Run Code Online (Sandbox Code Playgroud)
对您的条件使用可控制WHERE表达式,以便 Postgres 可以在created_at. 对于性能而言,比其他所有因素都重要得多。
要涵盖一周(包括今天),请从“今天”开始减去 6 天,而不是 7 天。或者,将周移 1 以结束“昨天”,因为“今天”显然还不完整。
假设id定义为NOT NULL,count(*)与 相同count(id),但速度稍快。看:
简单情况不需要CTE 。会更慢、更冗长。
先聚合,后加入。这样更快。
now()是 Postgres 标准 SQL 的简短语法CURRENT_TIMESTAMP(您也可以使用它)。看:
这应该是最短且最快的查询。测试用EXPLAIN ANALYZE.
有关的:
| 归档时间: |
|
| 查看次数: |
3156 次 |
| 最近记录: |