景:产品作了一个周期7天活动,用户能够每一天解锁一个任务,完成后发放奖励;微信
需求:按日统计连续完成N天用户数
app
目的:用户参与活动的兴趣度;函数
活动海报图:
ui
分析思路:spa
这就是连续登录问题,用至关时间差断定;.net
用户明细以下:3d
借用lag函数断定上一次登录日期;orm
连续登录几天,其datediff日期差等于连续登录天数blog
附上代码:ci
,with tmp_da_user as (
select
to_date(ds,'yyyymmdd') as ds
,uid
,count(distinct ds) as 完整天数
from tmp_t_user_takse_detail
where status_name = '完成'
and uid in ('203111313364823804','1833903495100023')
group by
ds
,uid
)
,tmp_da_user_tack as (
select *
,lag(ds,1)over(partition by uid order by ds asc) as lag_1
,lag(ds,2)over(partition by uid order by ds asc) as lag_2
,lag(ds,3)over(partition by uid order by ds asc) as lag_3
,lag(ds,4)over(partition by uid order by ds asc) as lag_4
,lag(ds,5)over(partition by uid order by ds asc) as lag_5
,lag(ds,6)over(partition by uid order by ds asc) as lag_6
,lag(ds,7)over(partition by uid order by ds asc) as lag_7
from tmp_da_user
)
select
ds
,count(distinct uid) as 当天完成任务数
,count(case when DATEDIFF(ds,lag_1,'dd') = 1 then uid end ) as 连续2天完成
,count(case when DATEDIFF(ds,lag_2,'dd') = 2 then uid end ) as 连续3天完成
,count(case when DATEDIFF(ds,lag_3,'dd') = 3 then uid end ) as 连续4天完成
,count(case when DATEDIFF(ds,lag_4,'dd') = 4 then uid end ) as 连续5天完成
,count(case when DATEDIFF(ds,lag_5,'dd') = 5 then uid end ) as 连续6天完成
,count(case when DATEDIFF(ds,lag_6,'dd') = 6 then uid end ) as 连续7天完成
,count(case when DATEDIFF(ds,lag_7,'dd') = 7 then uid end ) as 连续8天完成
from tmp_da_user_tack
group by ds
本文分享自微信公众号 - SQL数据分析(dianwu_dw)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。