Я бы обычно делал это, используя row_number()
:
select date, count(*),
sum(count(*)) over (order by date),
sum(sum(case when seqnum = 1 then 1 else 0 end)) over (order by date)
from (select t.*,
row_number() over (partition by email order by date) as seqnum
from t
) t
group by date
order by date;
Это похоже на версию, использующую lag()
.Однако я нервничаю, используя лаг, если одно и то же письмо появляется несколько раз в одну и ту же дату.