概述
方法1-通过连续日期排名
首先我们筛选出最近七天的每日数据,属于每日设备行为,也就是说一条数据等于一次活跃
这一步对每日设备行为去重(正常情况下不写也可以,因为每日设备 行为理论上来说是已经去过重的)
然后再通过rank函数对每个日期后面都加一个数
逻辑是我们按照日期排序,那么如果是连续日期那么减去后面的数应该得到的值相等
即
6.15 1
6.16 2
6.17 3
这样每个日期减去自己的rank排名得到的都是6.14,再通过对这个减去得到的日期group by,如果count(*)为3,则三天连续
select
mid_id
from
(
select
mid_id,
date_add(dt,-rk) rk2
from
(
select
mid_id,
dt,
rank() over(partition by mid_id order by dt) rk
from
(
select
mid_id,
dt
from dws_uv_detail_daycount
where dt >= date_add('2020-06-25',-6)
group by mid_id,dt
)t1
)t2
)t3
group by mid_id,rk2
having count(*) >= 3
这样我们就筛选出连续三天活跃的用户了,但是有一种特殊情况是它在一周的前三天连续活跃,第四天不活跃,之后三天又活跃。这样的话它的数值可以假设为
6.15 1
6.16 2
6.17 3
6.19 4
6.20 5
6.21 6
则它最终得到count(*)为3的分组为两组6.14和6.15;但它其实都是一个用户,所以我们要在上述代码外面再套一层group by mid_id
最终代码如下
select
'2020-06-25',
concat(date_add('2020-06-25',-6),'_','2020-06-25'),
count(*)
from
(
select
mid_id
from
(
select
mid_id
from
(
select
mid_id,
date_add(dt,-rk) rk2
from
(
select
mid_id,
dt,
rank() over(partition by mid_id order by dt) rk
from
(
select
mid_id,
dt
from dws_uv_detail_daycount
where dt >= date_add('2020-06-25',-6)
group by mid_id,dt
)t1
)t2
)t3
group by mid_id,rk2
having count(*) >= 3
)t4
group by mid_id
)t5;
方法2-通过开窗函数
还是先筛选出一周的数据
对于每个用户的日期后面都加一个字段,这个字段是这个用户的日期的下两行的日期,比如用户a,的dt这一列有6.15,6.17,6.18dt数据,则在a,6.15后面再拼一个6.15下面两行的数据也就是6.18。如果下两行没数据就给9999,如下
然后再开窗,通过用户分类,dt排序
然后通过datediff函数找到lead2_dt减去原本dt为2的数据(就类似于6.15,6.16,6.17,这种6.17减去6.15就为2,则三天连续),再去重
最后
以上就是欢喜睫毛膏为你收集整理的数仓体系——最近七天内连续三天活跃用户数方法1-通过连续日期排名方法2-通过开窗函数的全部内容,希望文章能够帮你解决数仓体系——最近七天内连续三天活跃用户数方法1-通过连续日期排名方法2-通过开窗函数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复