我已成功使用PostgreSQL width_bucket(val, min, max, buckets)
函数将数据集划分为相等大小的存储桶。但是我的数据包含以毫秒为单位的时间范围(start_time
和end_time
)。我正在寻找一种基于时间间隔将行包含到多个存储桶中的方法。
这是我现在所在位置的一个示例。每行都有开始和结束存储桶:
start_time | end_time | start_bucket | end_bucket
------------+----------------+--------------+------------
0 | 492 | 1 | 1
404 | 580 | 1 | 1
0 | 628 | 1 | 1
560 | 740 | 1 | 2
644 | 720 | 1 | 2
24 | 160 | 1 | 1
0 | 88 | 1 | 1
640 | 1268 | 1 | 2
556 | 716 | 1 | 1
0 | 2086 | 1 | 3
我正在寻找汇总结果:
bucket | count
------------+---------------
1 | 10
2 | 4
3 | 1
如果只考虑单独地start_time
或end_time
,我知道如何获得结果。有没有一种方法可以将我现在拥有的信息汇总到期望的结果中?
答案 0 :(得分:3)
使用generate_series()
:
select gs.bucket, count(*)
from t cross join lateral
generate_series(t.start_bucket, t.end_bucket) as gs(bucket)
group by gs.bucket
order by 1;