工作,需要帮助 - 如何拆分重叠的范围?

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

img1 img2

我有 3 个 tsranges 如下图重叠,我如何划分它们以便我们有 0-1 黑色,1-2 绿色,2-3 黑色,3-4 绿色和 4-5 黑色?喜欢 img2?

我试图将它们聚集在一起,但无法抓住果岭之间的黑色时间

id 范围 颜色
01 2023-05-05T20:00:345Z 至 2023-05-05T22:00:345Z 黑色
02 2023-05-05T20:30:345Z 至 2023-05-05T20:42:345Z 绿色
03 2023-05-05T21:00:345Z 至 2023-05-05T21:20:345Z 绿色

结果应该是

id 范围 颜色
01 2023-05-05T20:00:345Z 至 2023-05-05T20:30:345Z 黑色
02 2023-05-05T20:30:345Z 至 2023-05-05T20:42:345Z 绿色
03 2023-05-05T20:42:345Z 至 2023-05-05T21:00:345Z 黑色
04 2023-05-05T21:00:345Z 至 2023-05-05T21:20:345Z 绿色
05 2023-05-05T21:20:345Z 至 2023-05-05T22:00:345Z 黑色
sql postgresql overlap date-range sql-timestamp
1个回答
0
投票

多范围是表达这一点的便捷方式。

要获得所有绿色范围,将它们聚合:

SELECT range_agg(range) FILTER (WHERE color = 'GREEN')
FROM tab;

从黑色范围的总和中减去这个得到余数:

SELECT range_agg(range) FILTER (WHERE color = 'BLACK')
     - range_agg(range) FILTER (WHERE color = 'GREEN')
FROM tab;

您可以使用

unnest()
函数将多范围分解为范围表。

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