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

Maximale sequentielle Streaks mit Ereignissen erzielen

Ihr Instinkt ist gut darin, sich die Zeilen mit null Ereignissen anzusehen und sie abzuarbeiten. Wir können eine Unterabfrage mit einer Fensterfunktion verwenden, um die "Lücken" zwischen null Ereignistagen zu erhalten, und dann in einer Abfrage außerhalb davon den gewünschten Datensatz nehmen, etwa so:

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