附上数据的图像。在我的表格中,我有 3 列 id
、开始日期
和 结束日期
,以及如下值:
id start date end date
-------------------------------
100 2015-01-01 2015-12-31
100 2016-01-10 2018-12-31
200 2015-02-15 2016-03-15
200 2016-03-15 2016-12-31
300 2016-01-01 2016-12-31
400 2017-01-01 2017-12-31
500 2017-02-01 2017-12-31
600 2017-01-15 2017-03-05
600 2017-02-01 2018-12-31
我希望我的输出是
id start date end date
--------------------------------
100 2015-01-01 2015-12-31
100 2016-01-10 2018-12-31
200 2015-02-15 2016-12-31
300 2016-01-01 2016-12-31
400 2017-01-01 2017-12-31
500 2017-02-01 2017-12-31
600 2017-01-15 2018-12-31
查询:
select
id, *
from
dbo.test_sl
where
id in (select id
from dbo.test_sl
where end_date >= start_date
group by id)
请帮助我获得我正在寻找的输出。
最佳答案
这是间隙和岛屿问题的一个示例。在本例中,您希望查找同一 id
不重叠的相邻行。这些是团体的开始。组起始数的累加和,提供分组编号,可用于聚合。
在查询中,这看起来像:
select id, min(startdate), max(enddate)
from (select t.*,
sum(isstart) over (partition by id order by startdate) as grp
from (select t.*,
(case when exists (select 1
from test_sl t2
where t2.id = t.id and
t2.startdate < t.startdate and
t2.enddate >= t.startdate
)
then 0 else 1
end) as isstart
from test_sl t
) t
) t
group by id, grp;
关于sql - 在 sql 中选择重复多次的每个 ID 的 end_date >= start_date 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53806805/