Это форма пробелов и островков.
В этом случае я рекомендую использовать кумулятивный максимум, чтобы увидеть, есть ли какие-либо совпадения с предыдущими строками, и использовать его, чтобы определить, где начинается «остров». ,Затем используйте накопленную сумму, чтобы определить острова и совокупность:
select id, min(start_date), max(end_date
from (select t.*,
sum(case when prev_end_date >= start_date then 0 else 1 end) over (partition by id order by start_date) as grp
from (select t.*,
lag(end_date) over (partition by id
order by start_date
rows between unbounded preceding and 1 preceding
) as prev_end_date
from t
) t
) t
group by id, grp;