Din instinkt är bra att titta på raderna med noll händelser och arbeta bort dem. Vi kan använda en underfråga med en fönsterfunktion för att få "gap" mellan noll händelsedagar, och sedan i en fråga utanför tar den posten vi vill ha, som så:
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