我在获取累计非重复计数方面遇到困难,因此,我们假设以下数据集。
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.
希望如此,请记住,如果这会改变情况,那么这是一个非常大的数据集。
答案 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以获得最终输出