Код для этого типа проблемы довольно сложно.Вот один подход, который работает довольно хорошо:
with item (item_code, start_date, end_date) as (
select 111,to_date('15-05-2004','DD-MM-YYYY'),to_date('20-06-2004','DD-MM-YYYY') from dual union all
select 111,to_date('22-05-2004','DD-MM-YYYY'),to_date('07-06-2004','DD-MM-YYYY') from dual union all
select 111,to_date('20-06-2004','DD-MM-YYYY'),to_date('13-08-2004','DD-MM-YYYY') from dual union all
select 111,to_date('27-05-2004','DD-MM-YYYY'),to_date('30-08-2004','DD-MM-YYYY') from dual union all
select 111,to_date('02-09-2004','DD-MM-YYYY'),to_date('23-12-2004','DD-MM-YYYY') from dual union all
select 222,to_date('21-05-2004','DD-MM-YYYY'),to_date('19-08-2004','DD-MM-YYYY') from dual
),
id as (
select item_code, start_date as dte, count(*) as inc
from item
group by item_code, start_date
union all
select item_code, end_date, - count(*) as inc
from item
group by item_code, end_date
),
id2 as (
select id.*, sum(inc) over (partition by item_code order by dte) as running_inc
from id
),
id3 as (
select id2.*, sum(case when running_inc = 0 then 1 else 0 end) over (partition by item_code order by dte desc) as grp
from id2
)
select item_code, min(dte) as start_date, max(dte) as end_date
from id3
group by item_code, grp;
и rextester для его проверки.
Что это делает?Хороший вопрос.Идея в этих проблемах состоит в том, чтобы определить смежные группы.Этот метод делает это путем подсчета количества «начинается» и «заканчивается» до определенной даты.Когда значение равно 0, группа заканчивается.
Конкретные шаги заключаются в следующем:
(1) Разбейте все даты на отдельные строки вместе с индикатором того, является ли датадата начала или окончания.Этот индикатор является ключевым для определения диапазонов - +1 для «входа» и «-1» для выхода.
(2) Рассчитать промежуточную сумму индикаторов.0 в этой сумме являются концами перекрывающихся диапазонов.
(3) Выполните обратную кумулятивную сумму нулей, чтобы идентифицировать группы.
(4) Объедините, чтобы получить окончательные результаты.
Вы можете посмотреть на каждый из CTE, чтобы увидеть, что происходит с данными.