【发布时间】:2022-03-25 22:39:00
【问题描述】:
我在 PostgreSQL 9.2 中有一个表,看起来像这样(简化):
CREATE TABLE my_features
(
id integer NOT NULL,
feature_id integer NOT NULL,
begin_time timestamp NOT NULL,
end_time timestamp
)
对于每个 feature_id,可能有多个行,其时间范围由 begin_time/end_time 指定。它们可能重叠,但这种情况比较少见。我正在寻找一种快速的方法来查找所有具有/不具有任何重叠的 feature_id。
我尝试使用窗口函数来做到这一点,如下所示:
SELECT feature_id, bool_or(end_time > lead(begin_time) OVER ts_win) OVER ts_win AS overlaps_any
FROM my_features
WINDOW ts_win AS (PARTITION BY feature_id ORDER BY begin_time)
...但这不起作用:
ERROR: window function calls cannot be nested
算法很简单:按 begin_time 对给定 feature_id 的行进行排序,并检查是否有 end_time > 下一个 begin_time(如果有)。我怀疑一定有一种简单的方法可以做到这一点,也许使用 tsrange 函数,但现在似乎找不到。
【问题讨论】:
标签: sql postgresql