Вот один из способов решения этой проблемы, который будет работать, по крайней мере, еще до Oracle 10.2.Он использует аналитические функции и иерархический запрос.
Предложение WITH предназначено только для создания примеров данных на лету.Вам это не нужно - удалите его и используйте ваши фактические имена таблиц и столбцов в запросе.(В предложении WITH я объявил столбцы после имени CTE, которое работает только в Oracle 11.2 и выше, но предложение WITH не является частью решения, поэтому я не стал бы беспокоиться об этом.)
with
sample_data (country, date_id) as (
select 'USA', 199003 from dual union all
select 'USA', 200004 from dual union all
select 'USA', 200005 from dual union all
select 'USA', 200009 from dual union all
select 'USA', 200010 from dual union all
select 'UK' , 199307 from dual union all
select 'UK' , 199308 from dual union all
select 'UK' , 199408 from dual
)
select country, date_id
from (
select country, date_id,
row_number() over (partition by country order by dt) as rn,
count(*) over (partition by country order by dt
range between current row
and interval '4' month following) as ct
from (
select country, date_id,
to_date(to_char(date_id, 'fm999999'), 'yyyymm') as dt
from sample_data
)
)
start with rn = 1
connect by country = prior country and rn = prior rn + prior ct
;
COUNTRY DATE_ID
------- ----------
UK 199307
UK 199408
USA 199003
USA 200004
USA 200009
Для сравнения вот решение match_recognize
, для которого требуется Oracle 12.1 или выше:
select country, date_id
from (
select country, date_id,
to_date(to_char(date_id, 'fm999999'), 'yyyymm') dt
from sample_data
)
match_recognize(
partition by country
order by date_id
all rows per match
pattern (a {- b* -})
define b as dt < add_months(a.dt, 5)
);