Насколько я понимаю правила
with
-- test data
t1 (id, START_DATE, END_DATE) as
(
SELECT 1, to_date('1-Jan-2004'), to_date('31-Dec-2005') FROM DUAL UNION ALL
SELECT 2, to_date('1-Jan-2001'), to_date('31-Dec-2001') FROM DUAL UNION ALL
SELECT 3, to_date('1-Jan-2011'), to_date('31-Dec-2015') FROM DUAL
)
-- test inputs
, inp (id, START_DATE, END_DATE) as
(
SELECT 1, to_date('1-Jan-2012'), to_date('31-Dec-2017') FROM DUAL UNION ALL
SELECT 2, to_date('1-Jan-2007'), to_date('31-Dec-2012') FROM DUAL UNION ALL
SELECT 3, to_date('1-Jan-2009'), to_date('31-Dec-2017') FROM DUAL UNION ALL
SELECT 4, to_date('1-Jan-2005'), to_date('31-Dec-2012') FROM DUAL UNION ALL
SELECT 5, to_date('1-Jan-2003'), to_date('31-Dec-2003') FROM DUAL
)
-- find matches and extend the original interval
, extended as (
SELECT inp.id inp_id, t1.id id, least(t1.START_DATE, inp.START_DATE) START_DATE, greatest(t1.END_DATE, inp.END_DATE) END_DATE
, row_number() over (partition by inp.id order by least(t1.START_DATE, inp.START_DATE)) rn
FROM t1
join inp on inp.START_DATE <= t1.END_DATE+1 and t1.START_DATE <= inp.END_DATE +1
)
-- select the only (rn=1) original data row the input is applied to, find and exclude intersections with other original data rows
, truncated as
(select e.inp_Id, e.id
, case when t1.id is not null then
case when e.START_DATE < t1.START_DATE then e.START_DATE else t1.END_DATE + 1 end
else e.START_DATE end START_DATE
, case when t1.id is not null then
case when e.START_DATE < t1.START_DATE then t1.START_DATE - 1 else e.END_DATE end
else e.END_DATE end END_DATE
from extended e
left join t1 on e.id != t1.id and e.START_DATE <= t1.END_DATE and t1.START_DATE <= e.END_DATE
where e.rn=1
)
-- see the results after the input is applied
select t1.id, e2.inp_id, coalesce(e2.START_DATE, t1.START_DATE) START_DATE, coalesce(e2.END_DATE,t1.END_DATE) END_DATE
from t1
left join truncated e2 on t1.id = e2.id
order by e2.inp_id, t1.id;
Возвращает
INP_ID ID START_DATE END_DATE
1 3 01-JAN-11 31-DEC-17
2 3 01-JAN-07 31-DEC-15
3 3 01-JAN-09 31-DEC-17
4 1 01-JAN-04 31-DEC-10
5 1 01-JAN-03 31-DEC-05
2 01-JAN-01 31-DEC-01
Таким образом, входы 1,2 и 3 обновляют строку-3, входы 4 и 5 обновляют строку-1,строка-2 никогда не обновляется.