Използвайте lag()
и кумулативна сума:
with query as (
select w.*,
sum(case when week < prev_week + 2 then 0 else 1 end) over (partition by animal order by week) as grp
from (select w.*,
lag(week) over (partition by animal order by week) as prev_week
from test.walk w
) w
)
select
animal, week, grp,
dense_rank() over (order by animal, grp) as grp2
from query
Забележка:Това ще рестартира броенето за всяко животно -- което изглежда е действителното намерение на това, което искате да направите. Дефиницията на проблема е малко трудна, ако искате групите да бъдат разделени по животно, но да бъдат нарастващи. Един метод е:
select w.*,
sum(case when prev_week = week then 0 else 1 end) over (order by min_week, animal, week) as grp
from (select w.*,
lag(week) over (partition by animal order by week) as prev_week,
min(week) over (partition by animal) as min_week
from test.walk w
) w;