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

Obtener la máxima racha secuencial con eventos

Su instinto es bueno al mirar las filas con cero eventos y trabajar con ellos. Podemos usar una subconsulta con una función de ventana para obtener las "brechas" entre cero días de evento, y luego en una consulta externa tomar el registro que queremos, así:

select * 
from (
  select date as day_after_streak
   , lag(date) over(order by date asc) as previous_zero_date 
   , date - lag(date) over(order by date asc) as difference
   , date_part('days', date - lag(date) over(order by date asc) ) - 1 as streak_in_days
  from dates

  group by date
  having sum(events) = 0 ) t 
where t.streak_in_days is not null
order by t.streak_in_days desc
limit 1