SQL连续登录问题之间隔一天

题目:

某游戏公司记录的用户每日登录数据 
id dt 
1001 2021-12-12 
1002 2021-12-12 
1001 2021-12-13 
1001 2021-12-14 
1001 2021-12-16 
1002 2021-12-16 
1001 2021-12-19 
1002 2021-12-17 
1001 2021-12-20

问题:计算每个用户最大的连续登录天数,可以间隔一天。

解释:如果一个用户在 1,3,5,6 登录游戏,则视为连续 6 天登录

解答思路:

        第一步:首先将数据按照用户分组、登录日期升序排序。求出当天登录日期-上一次登录日期,这是为了求距离上一天登录日期已经过去了几天。如果小于等于2,说明是连续的,记为0.如果大于2,说明不连续,记为1,用1作断点。

        第二步:按照用户分组、登录日期升序排序求断点列的累加和。如果登录间隔小于等于2,说明是连续的,累加后仍然是0,如果下一个登录日期是2天以后,那应该加1,此时与前边的累加值不一样。以此类推,只要不连续,累加值都会+1.

        第三步:按照用户和累加列分组,用组内的最大登录日期-最小登录日期+1,此时就是这一个连续登录期间的天数。

        第四步:按照用户分组,取最大的连续登录天数

代码如下:

select c.id,max(c.rn1) 最大连续登录天数 --取每个用户最大的连续登录天数
from(--根据id和rn列进行分组,每个组的最大登录日期-最小登录日期+1就是每个用户的连续登录天数
	select b.id,b.rn,count(1) cnt,max(b.dt)-min(b.dt)+1 rn1
	from (	---根据id分组,对登录日期升序排序后对flag字段累加。连续登录的(包括间隔一天)的为一个值,不连续的(间隔大于两天的)会+1。
			select a.id
					,a.dt
					,sum(a.flag)over(partition by a.id order by a.dt) rn
			from(	---lag(dt)是为了获取登录当天的上一天登录日期
					---如果当天登录日期-上一天登录日期<=2 记为0; >2的记为1。 这么做的目的是用于后面的计算,给一个断点
					select
						id
						,dt
						,case when dt-lag(dt)over(partition by id order by dt)<=2 then 0 else 1 end as flag 
					from (select distinct id dt from table) --去重
			) a
	)b
	group by b.id,b.rn
)c
group by c.id

数据演示:(由于本人现在无法登录数据库,采用Excel演示数据)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值