Если все, что у вас есть, это набор диапазонов дат, без каких-либо других коррелирующих или ограничивающих критериев, и вы хотите уменьшить его до набора непересекающихся диапазонов, вы можете сделать это с помощью рекурсивного запроса, подобного этому:
with recur(start_date, end_date) as (
select * from yourdata yd
where not exists (select 1 from yourdata cyd
where yd.start_Date between cyd.start_date and cyd.end_date
and (yd.start_date <> cyd.start_date or yd.end_date <> cyd.end_date))
union all
select r.start_date
, yd.end_date
from recur r
join yourdata yd
on r.start_date < yd.start_date
and yd.start_date <= r.end_date
and r.end_date < yd.end_date
)
select start_date, max(end_date) end_Date from recur group by start_Date;
В этом запросе якорь (часть перед объединением всех) выбирает все записи, дата начала которых не содержится ни в каком другом диапазоне.
Рекурсивная часть (часть после объединения всех) затем выберите диапазоны, которые расширяют текущий диапазон.В обеих половинах возвращается исходная дата начала, в то время как в рекурсивной части возвращается новая расширенная дата окончания.Это приводит к набору перекрывающихся диапазонов с общей датой начала.
Наконец, выходной запрос возвращает дату начала и максимальную дату окончания, сгруппированные по дате начала.