大数据练习题mysql之求连续出勤和连续最大登陆天数

某APP活跃用户,字段uid和dt两个字段,求连续出勤天数大于等于三天的用户和用户最大登录天数
在这里插入图片描述
求连续出勤天数,使用row_number()方法:

SELECT 
	   a.uid,
	   DATE_SUB(a.dt,INTERVAL a.rn DAY),COUNT(1) 
FROM
(SELECT 
		 uid
		,dt
		,row_number() over(PARTITION BY uid ORDER BY dt) AS rn
     FROM active
) a
GROUP BY a.uid,DATE_SUB(a.dt,INTERVAL a.rn DAY)
HAVING COUNT(1)>=3

思路:求连续登录数

求连续出勤的时候,我们可以发现每个日期是相差一天的,当我们使用
row_number() over(PARTITION BY uid ORDER BY dt) AS rn 的时候,使用DATE_SUB(a.dt,INTERVAL a.rn DAY),即连续出勤减去递增的数字得到的结果是相等的,如果非连续的状态得到的结果是不等的

在这里插入图片描述
在这里插入图片描述
这时候再使用合并的累加的方法就可以算出最终结果
GROUP BY a.uid,DATE_SUB(a.dt,INTERVAL a.rn DAY)
HAVING COUNT(1)>=3
在这里插入图片描述

思路:求最大活跃数

当我求出连续活跃天数的方法后,用户的最大活跃天数就相对轻松了,只要在活跃天数的累加后,追加max函数:

SELECT
			  b.uid
			 ,MAX(b.ct) FROM
(
	SELECT
					 a.uid
					 ,DATE_SUB(a.dt,INTERVAL a.rn DAY),COUNT(1) AS ct 
	FROM
				(SELECT uid
								,dt
								,row_number() over(PARTITION BY uid ORDER BY dt) AS rn
				FROM active
				) a
				GROUP BY a.uid,DATE_SUB(a.dt,INTERVAL a.rn DAY)
)b
GROUP BY uid

结果:
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值