累积不同计数

beq87vna  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(450)

我很难得到一个累积的不同计数,所以让我们假设下面的数据集。

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的distinct时考虑了1/1/18的数据,您将如何编写查询来获得以下结果。
结果如下。

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

希望这是有意义的,记住这是一个非常大的数据集,如果这改变了事情。

k5ifujac

k5ifujac1#

下面的查询可以给出所需的累计非重复计数。 --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以获得最终输出

dgsult0t

dgsult0t2#

您可以对每个项目的最早日期进行累计计数 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;

相关问题