我需要有关查询的帮助,该查询应按以下方式分割一些重叠的日期间隔。
例如,如果我们有下表
----------------------------------------------------------------------
| column_name | value | start_date | end_date |
----------------------------------------------------------------------
| column1 | value1 | 03-09-2020 | 26-09-2020 |
----------------------------------------------------------------------
| column1 | value2 | 07-09-2020 | 20-09-2020 |
----------------------------------------------------------------------
我在提出查询以生成以下输出时遇到问题:
----------------------------------------------------------------------
| column_name | value | start_date | end_date |
----------------------------------------------------------------------
| column1 | value1 | 03-09-2020 | 07-09-2020 |
----------------------------------------------------------------------
| column1 | value2 | 07-09-2020 | 20-09-2020 |
----------------------------------------------------------------------
| column1 | value1 | 20-09-2020 | 26-09-2020 |
----------------------------------------------------------------------
最佳答案
一种方法是获取所有日期并使用横向连接来计算该日期的值:
with dates as (
select start_date as date
from t
union
select end_date
from t
)
select tt.value, d.date as start_date, lead(d.date) over (order by d.date) as end_date
from dates d left join lateral
(select t.*
from t
where start_date <= d.date and
end_date > d.date
order by start_date desc -- this gets the most recent overlapping value
limit 1
) tt
on true
order by d.date;
Here是一个数据库<> fiddle 。
请注意,这会添加一个额外的行,其中包含最后的“无值”句点。如果您不需要,可以轻松过滤掉它。
关于sql - 在 PostgreSQL 中将重叠的间隔分割成较小的、接触的间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64608335/