sql - Postgresql - 按小时分组查询时添加空元组

标签 sql postgresql pg

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

例如我得到:

|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/

相关文章:

ruby-on-rails - Rails 可选关联查询

mysql - 支持分页查询的数据库最低版本

ruby-on-rails - Rails pg gem,安装pg时出错

postgresql - 如何在 Mac OS X Leopard 上为 Rails 3.X 编译 sqlite3、mysql 和 postgres 驱动程序?

sql - 带引号的字符串未正确终止

sql - 如何读取/写入 Easy Dental 2010 DAT 文件?

python - 获取文章->产品关系的最低价目表

sql - 返回 WHERE 子句不完全匹配的行

node.js - 带有 node js pg 驱动程序的 CockroachDB

mysql - 如果字段尚不存在则更改表