累计非重复计数

时间:2018-08-29 22:53:41

标签: sql hive teradata

我在获取累计非重复计数方面遇到困难,因此,我们假设以下数据集。

   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/2/18的非重复数据时,如何考虑查询1/1/18的数据,如何编写查询以获取以下结果。

因此它将是以下结果。

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

希望如此,请记住,如果这会改变情况,那么这是一个非常大的数据集。

2 个答案:

答案 0 :(得分:0)

您可以对每个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;

答案 1 :(得分:0)

下面的查询可以提供所需的累计非重复计数。

--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以获得最终输出