我有 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 | 黑色 |
多范围是表达这一点的便捷方式。
要获得所有绿色范围,将它们聚合:
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()
函数将多范围分解为范围表。