我有一张桌子
logs_bl_sj
,是由startdate
订购的:
联邦 | 开始日期 | 结束日期 |
---|---|---|
'黑森' | 2015-02-26 16:22:21 | 2015-02-26 16:31:31 |
'黑森' | 2015-10-20 22:34:54 | 2015-10-20 22:35:03 |
'不来梅' | 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
,我想找到包含 [a, b)
且 s
具有相同值的时间范围 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
中的时间范围数...我期望包含bundesland
的时间范围数。额外问题:按程序执行此操作是否会更好,例如在Python中?迭代有序的开始日期,可以保留一个根据存储的结束日期数组而变化的运行计数...而 PostgreSQL 必须为每一行开始一个新的计数...