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);
为您的条件使用一个可扩展的表达式
WHERe
,因此Postgres可以在上使用一个普通索引created_at
。对于性能而言,其重要性远胜于其他所有性能。要涵盖一周(包括今天),请从“今天”开始减去6天,而不是7天。
假设
id
已定义NOT NULL
,count(*)
与count(id)
此处相同,但速度稍快。一个CTE将是矫枉过正这里。它更慢,更冗长。
先聚集,然后加入。在这种情况下,速度更快。
now()
是标准SQLCURRENT_TIMESTAMP
(也可以使用)的Postgres实现的较短和更快的实现。
这应该是最短和最快的查询。用进行测试
EXPLAIN ANALYZE。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)