我有一张表logs_bl_sj
,由startdate
订购:
bundesland | startdate | enddate |
---|---|---|
'Hessen' | 2015-02-26 16:22:21 | 2015-02-26 16:31:31 |
'Hessen' | 2015-10-20 22:34:54 | 2015-10-20 22:35:03 |
'Bremen' | 2015-10-20 22:35:50 | 2015-10-20 22:37:03 |
... |
我想为每一行r
查找该表中存在多少行x
,其中:
x.startdate <= r.startdate
、r.startdate < x.enddate
和r.bundesland = x.bundesland
换句话说,对于每个startdate
s
,我想找到包含s
的时间范围[a, b)
的数量,与bundesland
的值相同(始终至少为1:s
始终包含在[s, b)
中).
请注意表的顺序是多么有用:对于每一行,该行后面的行将不计数,因此甚至不应该判断.
如何通过PostgreSQL利用这一事实?即,如何让服务器在计算该行时忽略每一行后的所有行?
我即将获得正确数据的查询,但它没有上述优化.这是我拥有的:
SELECT bundesland, startdate, COUNT(time_range) FILTER (WHERE time_range @> startdate::timestamp) OVER (PARTITION BY bundesland)
FROM logs_bl_sj_timerange
其中logs_bl_sj_timerange
从上算logs_bl_sj
,但添加了列time_range
,该列仅为tsrange
和[startdate, enddate)
.
COUNT
只是返回bundesland
中time_ranges的数量.我预计bundesland
中包含startdate
的时间范围数.
额外的问题:通过程序方式完成这件事(例如在Python中)会更好吗?迭代排序的开始日期,可以保留运行计数,该计数根据存储的结束日期数组而变化..而PostgreSQL必须为每一行开始新的计数.