Счетчик хода отличается
Я пытаюсь увидеть, как совокупное количество подписчиков менялось с течением времени на основе уникальных адресов электронной почты и даты их создания. Ниже приведен пример таблицы, с которой я работаю.
Я пытаюсь превратить это в таблицу ниже. Электронная почта 1@gmail.com была создана дважды, и я хотел бы посчитать ее один раз. Я не могу понять, как сгенерироватьотдельный столбецСчетчик хода.
Спасибо за помощь.
3 ответа
Я бы обычно делал это используя 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()
, Однако я нервничаю, используя лаг, если одно и то же письмо появляется несколько раз в одну и ту же дату.
Получить общее количество и совокупный счет прямо вперед. Чтобы получить совокупное различное количество, используйте lag
чтобы проверить, есть ли в письме строка с предыдущей датой, и установите флаг в 0, чтобы он игнорировался во время текущей суммы.
select distinct dt
,count(*) over(partition by dt) as day_total
,count(*) over(order by dt) as cumsum
,sum(flag) over(order by dt) as cumdist
from (select t.*
,case when lag(dt) over(partition by email order by dt) is not null then 0 else 1 end as flag
from tbl t
) t
DEMO HERE
Вот решение, которое не использует sum over
ни lag
... и дает правильные результаты.
Следовательно, это может показаться более простым для чтения и поддержки.
select
t1.date_created,
(select count(*) from my_table where date_created = t1.date_created) emails_created,
(select count(*) from my_table where date_created <= t1.date_created) cumulative_sum,
(select count( distinct email) from my_table where date_created <= t1.date_created) running_count_distinct
from
(select distinct date_created from my_table) t1
order by 1