获取每天创建的条目数

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)

Erw*_*ter 6

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 NULLcount(*)与 相同count(id),但速度稍快。看:

简单情况不需要CTE 。会更慢、更冗长。

先聚合,后加入。这样更快。

now()是 Postgres 标准 SQL 的简短语法CURRENT_TIMESTAMP(您也可以使用它)。看:

这应该是最短且最快的查询。测试用EXPLAIN ANALYZE.

有关的: