Sử dụng lag()
và tổng tích lũy:
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
Lưu ý:Thao tác này sẽ bắt đầu lại quá trình đếm cho từng con - đây dường như là ý định thực sự của những gì bạn muốn làm. Định nghĩa của vấn đề là một chút phức tạp nếu bạn muốn các nhóm được phân tách theo động vật, nhưng phải tăng dần. Một phương pháp là:
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;