PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Obtenir une séquence séquentielle maximale avec des événements

Votre instinct est bon pour regarder les lignes avec zéro événement et les travailler. Nous pouvons utiliser une sous-requête avec une fonction de fenêtre pour obtenir les "écarts" entre zéro jour d'événement, puis dans une requête en dehors de celle-ci, prendre l'enregistrement que nous voulons, comme ceci :

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