累积不同的计数

时间:2016-11-09 20:53:26

标签: sql presto

我正在进行查询,以便每天获得累计不同的uid数量。

示例:假设2016-11-01有2个uid(100,200)出现,并且他们也在第二天出现了新的uid 300(100,200,300)2016-11-02 此时我希望商店累计数量为3而不是5(用户ID 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;

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

4 个答案:

答案 0 :(得分:3)

您可以使用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 :(得分:2)

最简单的方法:

SELECT *, count(*) over (order by fst_date ) cum_uids
  FROM (
SELECT uid, min(date) fst_date FROM t GROUP BY uid
 ) t

或类似的东西

答案 2 :(得分: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;

此语句首先将sample_table的一个实例加入另一个实例,使leftTable中的每条记录都与rightTable中的每条记录相关联。或等于date值。这有效地将列表附加到已发生并包括date值的所有uid值中的date个。

使用date将生成的数据集细化为唯一的uidGROUP BY组合。

子查询allUIDSForDateFinder中的精炼数据集随后由date按查询主体分组,与每个组关联的COUNT() uid个值为进行。

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

答案 3 :(得分:0)

WITH firstseen AS (
  SELECT uid, MIN(date) date
  FROM sample_table
  GROUP BY 1
)
SELECT DISTINCT date, COUNT(uid) OVER (ORDER BY date) daily_cumulative_count 
FROM firstseen
ORDER BY 1

使用SELECT DISTINCT是因为(date, COUNT(uid))将被重复很多次。

说明:对于每个日期dt,它从最早的日期开始计数直到dt,因为我们指定了ORDER BY date,并且默认值为BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW。 >