PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Erhöhen Sie den Spaltenwert unter bestimmten Bedingungen in der SQL-Abfrage auf Postgresql

Verwenden Sie lag() und kumulative Summe:

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

Hinweis:Dadurch wird das Zählen für jedes Tier neu gestartet - was die eigentliche Absicht dessen zu sein scheint, was Sie tun möchten. Die Definition des Problems ist etwas schwierig, wenn Sie möchten, dass die Gruppen nach Tieren getrennt, aber inkrementell sind. Eine Methode ist:

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;