Je instinct is goed om naar de rijen met nul gebeurtenissen te kijken en ze uit te werken. We kunnen een subquery met een vensterfunctie gebruiken om de "gaten" tussen nul gebeurtenisdagen te krijgen, en dan in een query daarbuiten het record nemen dat we willen, zoals zo:
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