sql - PostgreSQL - 获取按日期时间列分组的表中 N 个间隔的项目计数
问题描述
我有一个用户表,其中有以下字段。
| id | created_at | username |
我想过滤这个表,以便我可以获得在日期时间范围内创建的用户数,分成 N 个间隔。例如,对于created_at
介于两者之间2019-01-01T00:00:00
并2019-01-02T00:00:00
分成 2 个间隔的用户,我会得到类似的东西。
_______________________________
| dt | count |
-------------------------------
| 2019-01-01T00:00:00 | 6 |
| 2019-01-01T12:00:00 | 7 |
-------------------------------
是否可以一击完成?我目前正在使用我的 Django ORM 创建 N 个日期范围,然后进行 N 个查询,这不是很有效。
解决方案
生成您想要的时间,然后使用left join
和聚合:
select gs.ts, count(u.id)
from generate_series('2019-01-01T00:00:00'::timestamp,
'2019-01-01T12:00:00'::timestamp,
interval '12 hour'
) gs(ts) left join
users u
on u.created_at >= gs.ts and
u.created_at < gs.ts + interval '12 hour'
group by 1
order by 1;
编辑:
如果要指定行数,可以使用类似的东西:
from generate_series(1, 10, 1) as gs(n) cross join lateral
(values ('2019-01-01T00:00:00'::timestamp + (gs.n - 1) * interval '12 hour')
) v(ts) left join
users u
on u.created_at >= v.ts and
u.created_at < v.ts + interval '12 hour'
推荐阅读
- android - 经纬度加5公里
- reactjs - 使用 apollo 和 graphql 上传大于 16 kb 的文件时会损坏
- c - 如何在自定义外壳中在后台执行进程?
- java - 在我的IDE IntelliJ中编写sql查询时遇到错误,你们知道如何解决这个问题吗?
- label - 向 altair 等值线地图添加标签
- c++ - OpenGL渲染白色纹理错误
- neo4j - Neo4j Cypher 查询以获取关注者创建的帖子
- typescript - 如何使用 Typescript 从 firebase (8+) 正确导入 Timestamp 类
- sql - 按 FROM 日期查找记录,行上没有 TO 日期
- python - MinMaxScaler() 在类似系列范围内的不同行为