【问题标题】:cummulative distinct count累积非重复计数
【发布时间】:2019-02-04 19:32:05
【问题描述】:

我无法获得累积的不同计数,所以我们假设以下数据集。

   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.

希望这是有道理的,请记住,如果这会改变事情,这是一个非常大的数据集。

【问题讨论】:

    标签: sql hive teradata


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      下面的查询可以给出所需的累积不同计数。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-19
        • 2020-07-18
        • 2018-01-01
        相关资源
        最近更新 更多