![](/img/trans.png)
[英]Select a count of rows, order by dynamic ranges of time intervals in PostgreSQL
[英]How can I aggregate a count of rows by time intervals in PostgreSQL?
如果我有一个 PostgreSQL 表,其中包含日期时间列和项目数组,例如:
| time | items |
| -------------------------- | ---------------------- |
| 2020-12-06 11:31:38.000 | {item1, item2} |
| 2020-12-06 11:48:11.304 | {item1} |
| 2020-12-06 11:48:48.654 | {item1, item2, item3} |
| 2020-12-06 11:49:50.355 | {item2} |
| 2020-12-06 11:55:31.842 | {item1, item2} |
如何查询表以在等距时间间隔内聚合特定项目的计数?
例如,我想每隔 5 分钟统计item1
的出现次数,这样查询结果如下所示:
| start_time | end_time | item1 count |
| -------------------------- | ----------------------------------- | --------------- |
| 2020-12-06 11:30:00.000 | 2020-12-06 11:34:99.999 | 1 |
| 2020-12-06 11:35:00.000 | 2020-12-06 11:39:99.999 | 0 |
| 2020-12-06 11:40:00.000 | 2020-12-06 11:44:99.999 | 0 |
| 2020-12-06 11:45:00.000 | 2020-12-06 11:49:99.999 | 2 |
| 2020-12-06 11:50:00.000 | 2020-12-06 11:54:99.999 | 0 |
| 2020-12-06 11:55:00.000 | 2020-12-06 11:59:99.999 | 1 |
我很难弄清楚什么查询可以帮助我以最佳方式实现这一目标。 我一直在想 Postgres 的date_trunc
或grid
可能会对此有所帮助,但我真的不确定如何解决这个问题。 有什么建议么?
您可以使用generate_series()
来生成时间戳。 然后取消嵌套、过滤和聚合:
select gs.ts, count(i.time) as num_item1
from generate_series('2020-12-06 11:30:00.000'::timestamp, '2020-12-06 11:55:00.000', interval '5 minute') gs(ts) left join
(items i join lateral
unnest(i.items) item
on item = 'item1'
)
on i.time >= gs.ts and i.time < gs.ts + interval '5 minute'
group by gs.ts
order by 1;
这是一个 db<>fiddle。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.