我们如何才能找到重叠搭接b/w之间的日期。重叠指的是,当开始日期和结束日期在相同的范围内,下面的示例第1行没有重叠。第二至第五行可以被认为是一套超过圈,因为有开始日期和结束是超过与他们自己,第6和第7行可以被认为是一套超过一圈为例。第6行和第7行->第7行的开始日期与第6行的结束日期在同一范围内,因此它成为重叠。
一旦找到重叠,然后需要查找min(开始日期)和最大值(结束日期),并希望为每个重叠指定唯一的id,并且在S.NO列中应该显示哪些行是重叠的。
下面是I/p和O/p


发布于 2020-11-11 11:59:23
这是一种空隙和孤岛问题。您可以使用累积最大值来确定是否存在重叠。然后,一个累积和聚合做你想做的事情:
select id, min(start_date), max(end_date),
listagg(s_no, ',') within group (order by s_no) as s_nos
from (select t.*,
sum(case when prev_end_date >= start_date then 0 else 1 end) over (partition by id order by s_no) as grp
from (select t.*,
max(end_date) over (
partition by id
order by s_no
rows between unbounded preceding and 1 preceding
) as prev_end_date
from t
) t
) t
group by id, grp;这里是db<>fiddle。
https://stackoverflow.com/questions/64784760
复制相似问题