Postgres SQL - 按小时分组查询时添加空元组

Postgres SQL - Add empty tuples when grouping query by hour

我正在编写查询以在 table 上按小时对事件进行分组。我的问题是,在没有 activity 的时间里,没有为他们显示行

例如我得到:

|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 上使用索引,明确的时间范围确保它在查询中被使用(如果查询计划者认为如此)。