利用PostgreSQL查询中表的顺序来统计包含每个时间的时间范围

问题描述 投票:0回答:2

我有一张桌子

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 必须为每一行开始一个新的计数...

postgresql
2个回答
0
投票


0
投票

startdate

根据奖励问题,我不认为 Python 会更快。您可以自己在大数据集上尝试一下。如果您有一个很大的数据集,那么使用一些扩展来执行此操作可能会更好(即:timescaledb)。

DBFiddle 演示

© www.soinside.com 2019 - 2024. All rights reserved.