Счетчик хода отличается - PullRequest
       8

Счетчик хода отличается

0 голосов
/ 12 декабря 2018

Я пытаюсь увидеть, как совокупное количество подписчиков менялось с течением времени на основе уникальных адресов электронной почты и даты их создания.Ниже приведен пример таблицы, с которой я работаю.

enter image description here

Я пытаюсь превратить ее в таблицу ниже.Электронная почта 1@gmail.com была создана дважды, и я хотел бы посчитать ее один раз.Я не могу понять, как сгенерировать Счетчик хода, отличный от столбца.

enter image description here

Спасибо за помощь.

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Вот решение, которое не использует 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
0 голосов
/ 12 декабря 2018

Я бы обычно делал это, используя 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().Однако я нервничаю, используя лаг, если одно и то же письмо появляется несколько раз в одну и ту же дату.

0 голосов
/ 12 декабря 2018

Получение общего и совокупного количества просто.Чтобы получить кумулятивное различное количество, используйте 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

...