我正在编写一个查询,以在表上按小时对事件进行分组。我的问题是,在没有事件的时间里,没有为他们显示线路
例如我得到:
|2015-04-07 08:00:00 | 2
|2015-04-07 09:00:00 | 1
|2015-04-07 11:00:00 | 1
当我想在不存在数据的小时内添加一个值为 0 的空行时:
|2015-04-07 08:00:00 | 2
|2015-04-07 09:00:00 | 1
|2015-04-07 10:00:00 | 0 <-- ADD EMPTY ROW
|2015-04-07 11:00:00 | 1
我的查询是:
SELECT date_trunc('hour', "timeStarted"::timestamp) as "DATE STARTED", COUNT(*)
FROM session s
WHERE "timeStarted" BETWEEN timestamp with time zone '2015-04-07 00:00:00+01' AND timestamp with time zone '2015-04-07 23:59:00+01'
GROUP BY date_trunc('hour', "timeStarted"::timestamp)
ORDER BY "DATE STARTED"
最佳答案
您可以使用函数generate_series
来实现这一点。 PostgreSQL documentation - 9.24. Set Returning Functions :
SELECT generate_series, COUNT("timeStarted")
FROM generate_series('2015-04-07 00:00:00+01', '2015-04-07 23:59:00+01', '1 hour'::interval)
LEFT JOIN session s ON date_trunc('hour', "timeStarted"::timestamp) = generate_series
AND "timeStarted" BETWEEN timestamp with time zone '2015-04-07 00:00:00+01' AND timestamp with time zone '2015-04-07 23:59:00+01'
GROUP BY generate_series
ORDER BY generate_series;
请注意,JOIN 条件中 timeStarted
明确规定的时间范围是多余的。如果在 timeStarted
上使用索引,则明确的时间范围可确保在查询中使用它(如果查询规划器认为如此)。
关于sql - Postgresql - 按小时分组查询时添加空元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29496133/