Jest to rodzaj problemu luk i wysp. Możesz użyć lag()
a następnie suma skumulowana:
select id, min(laufd), max(nextdt),
row_number() over (partition by id order by min(laufd)) as period
from (select t.*,
sum(case when prev_nextdt >= laufd - interval '2' day then 0 else 1 end) over
(partition by id order by order_row) as grp
from (select t.*,
lag(nextdt) over (partition by id order by order_row) as prev_nextdt
from t
) t
) t
group by grp, id;
EDYCJA:
Jeśli wartości są przechowywane jako ciągi, użyj:
select id, min(laufd), max(nextdt),
row_number() over (partition by id order by min(laufd)) as period
from (select t.*,
sum(case when prev_nextdt >= laufd - interval '2' day then 0 else 1 end) over
(partition by id order by order_row) as grp
from (select t.id, t.order_row, -- any other columns you need
to_date(laufd, 'YYYYMMDD') as laufd,
to_date(nextdt, 'YYYYMMDD') as next_dt,
lag(to_date(nextdt, 'YYYYMMDD')) over (partition by id order by order_row) as prev_nextdt
from t
) t
) t
group by grp, id;