Вы говорите: «Мне нужно повторять это, пока разница не станет <= 9». Для меня это означает, что вы хотите сгруппировать строки, если их разрывы не превышают 9 месяцев. Я не уверен, что другие ответы пытаются это сделать. </p>
Вы всегда должны указывать, какую версию базы данных Oracle вы используете. Если вы используете 12c или более позднюю версию, вы можете использовать чудесное предложение MATCH_RECOGNIZE:
with data(ID,Begin_Dt,End_DT ) as (
select 101, to_date('201205', 'yyyymm'), to_date('201208', 'yyyymm') from dual union all
select 101, to_date('201301', 'yyyymm'), to_date('201309', 'yyyymm') from dual union all
select 101, to_date('201401', 'yyyymm'), to_date('201502', 'yyyymm') from dual union all
select 101, to_date('201701', 'yyyymm'), to_date('201801', 'yyyymm') from dual
)
select * from (
select d.*,
months_between(
begin_dt,
lag(end_dt,1,begin_dt) over(partition by id order by end_dt)
) mon
from data d
)
match_recognize(
partition by id order by begin_dt
measures final last(end_dt) new_end_dt
all rows per match
pattern(a b*)
define b as sum(mon) <= 9
);
ID BEGIN_DT NEW_END_DT END_DT MON
101 2012-05-01 00:00 2015-02-01 00:00 2012-08-01 00:00 0
101 2013-01-01 00:00 2015-02-01 00:00 2013-09-01 00:00 5
101 2014-01-01 00:00 2015-02-01 00:00 2015-02-01 00:00 4
101 2017-01-01 00:00 2018-01-01 00:00 2018-01-01 00:00 23