совокупный отчетливый счет - PullRequest
0 голосов
/ 30 августа 2018

У меня проблемы с получением кумулятивного отличного числа, поэтому давайте просто предположим следующий набор данных.

   DATE       RID  
   1/1/18      1
   1/1/18      2
   1/1/18      3
   1/1/18      3

Так что, если мы запустим этот запрос

 SELECT DATE, COUNT(DISTINCT RID) FROM TABLE;

мы ожидаем, что он вернет 3, однако давайте предположим, что данные за следующий день выглядят следующим образом.

 DATE    RID
 1/2/18  1
 1/2/18  6
 1/2/18  9

Как бы вы написали запрос, чтобы получить следующие результаты, в которых учитываются данные за 1/1/18 при возврате отличного для 1/2/18.

Так что это будут следующие результаты.

  Date      Count(*)
  1/1/18      3
  1/2/18      5              <- 1/1/18 distinct plus + 1/2 distinct.

Надеюсь, что это имеет смысл, имейте в виду, что это очень большой набор данных, если это что-то меняет.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

В приведенном ниже запросе может быть указано необходимое совокупное различное число.

--Step 3: SELECT dt, cum_distinct_cnt FROM ( --Step 2: SELECT rid, dt, COUNT(CASE WHEN row_num = 1 THEN rid END) OVER (ORDER BY dt ROWS BETWEEN Unbounded PRECEDING AND CURRENT ROW) cum_distinct_cnt FROM ( --Step 1: SELECT rid, dt, ROW_NUMBER() OVER (PARTITION BY rid ORDER BY dt) row_num FROM table) innerTab1 ) innerTab2 QUALIFY ROW_NUMBER() OVER (PARTITION BY dt ORDER BY cum_distinct_cnt DESC) = 1

Поскольку ваш набор данных очень большой, вы можете разбить следующий запрос по шагам, как описано в запросе, и создать рабочие таблицы для заполнения innerTab1 / innerTab2 для получения окончательного результата

0 голосов
/ 30 августа 2018

Вы можете сделать кумулятивный подсчет самой ранней даты для каждого rid:

select mindate, count(*), sum(count(*)) over (order by mindate)
from (select rid, min(date) as mindate
      from t
      group by rid
     ) t
group by mindate
order by mindate;

Примечание: это будут пропущенные даты, которые не являются важными для некоторых rid. Вот один из способов получить все даты, если это проблема:

select mindate, count(rid), sum(count(rid)) over (order by mindate)
from ((select rid, min(date) as mindate
       from t
       group by rid
      )
      union all
      (select distinct NULL, date
       from t
      )
     ) rd
group by mindate
order by mindate;
...