2016-11-09 101 views
2

我正在查询以获得日常基础上累积的不同计数的uid。累计不同计数

例如:假设有2个uid(100,200)在2016-11-01出现,他们也在第二天在2016-11-02 上出现了新的uid 300(100,200,300)在这一点上我想要存储累计计数为3而不是5(用户标识100和200在过去一天已经出现)。

Input table: 

    date   uid   
2016-11-01   100 
2016-11-01   200 
2016-11-01   300 
2016-11-01   400   
2016-11-02   100 
2016-11-02   200     
2016-11-03   300 
2016-11-03   400 
2016-11-03   500 
2016-11-03   600 
2016-11-04   700 

Expected query result: 

date   daily_cumulative_count 
2016-11-01    4 
2016-11-02    4 
2016-11-03    6 
2016-11-04    7 

到目前为止,我可以获得每天累积的不同计数,但它也包括前一天的不同uid。

SELECT 
    date, 
    SUM(count) OVER (
    ORDER BY date ASC 
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 
) 
FROM (
    SELECT 
    date, 
    COUNT(DISTINCT uid) AS count 
    FROM sample_table 
    GROUP by 1 
)ORDER BY date DESC; 

任何形式的帮助将不胜感激。

回答

1

您可以使用exists来检查某个ID是否出现在任何以前的日期。然后获得运行总和,并找到每个组的最大值,这将使您获得每日不同的累计计数。

select dt, max(col) as daily_cumulative_count 
from (select t1.*, 
     sum(case when not exists (select 1 from t where t1.dt > dt and id = t1.uid) then 1 else 0 end) over(order by dt) col 
     from t t1) x 
group by dt 
1

请尝试以下...

SELECT date AS date 
     COUNT(uid) AS daily_cumulative_count 
FROM (SELECT leftTable.date AS date, 
       rightTable.uid AS uid 
     FROM sample_table AS leftTable 
     JOIN sample_table AS rightTable ON leftTable.date >= rightTable.date 
     GROUP BY leftTable.date, 
       rightTable.uid 
    ) AS allUIDSForDateFinder 
GROUP BY date; 

这种说法开始通过这样的方式,在leftTable每条记录​​都有与之相关联的每个记录的副本加盟sample_table一个实例到另一个来自rightTable,它具有较早或相等的date值。这有效地将所有uid值中的每个date附加到一个列表,该列表值已经达到并包括date值。

通过使用GROUP BY将得到的数据集细化为唯一的dateuid组合。

从子查询allUIDSForDateFinder精制数据集然后被date由查询的主体分组,以及与每个组相关联的uidCOUNT()值执行。

如果您有任何问题或意见,请随时发布相应评论。