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