我正在进行查询,以便每天获得累计不同的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;
任何形式的帮助将不胜感激。
答案 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
将生成的数据集细化为唯一的uid
和GROUP 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
。 >