sql >> Base de Datos >  >> RDS >> PostgreSQL

Incrementar el valor de la columna en ciertas condiciones en la consulta SQL en Postgresql

Usa lag() y suma acumulada:

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

Nota:Esto reiniciará la cuenta atrás para cada animal, lo que parece ser la intención real de lo que quieres hacer. La definición del problema es un poco complicada si desea que los grupos estén separados por animales, pero que sea incremental. Un método es:

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;