SQL实现连续登录天数和最大登录天数

SQL实现连续登录天数和最大登录天数

题目:求出用户连续登录天数
问题延伸:连续登录3天的用户,用户最大登录天数等

sheet1表中给定字段用户id,登录时间date,如下表:
sheet

1、清洗数据

由于是对连续登录天数的计算,这里精确到了时分秒,而表中可能出现,用户多次连续登录,同一天多次登录等情况,因此进行数据清洗。
这里只需要用date进行清洗就可以了。

SELECT id,date(date) time from sheet1 GROUP BY id ,time

得到:
在这里插入图片描述

2、 对用户的登录天数进行排序

这里需要用到窗口函数row_number() over(partition by 字段1 order by 字段2)

SELECT id,time,row_number() over(partition by id order by time) num 
from
(SELECT id,date(date) time from sheet1 GROUP BY id ,time) a

得到:
在这里插入图片描述

3、用登录时间减去排序号(以序号为天数)

因为如果用户是连续登录,比如1月2、3、4号都进行了登录,排序就是1、2、3,1月2号减对应序号1就得到1月1号,1月3号减对应序号2也得到1月1号,所以如果用户连续登录,那登录日期减去序号作为的天数,得到的日期是一样的。对减过序号后一样的日期进行计数,这个数就是连续登录的天数。 这里需要用到date_sub(time,interval number day)

SELECT *,DATE_SUB(time,INTERVAL num day) newtime
from
(SELECT id,time,row_number() over(partition by id order by time) num 
from
(SELECT id,date(date) time from sheet1 GROUP BY id ,time) a) a

得到:
在这里插入图片描述

4、对用户登录的天数进行计数

用户可能在不同时间段都进行过登录,所以连续登录天数可能发生过几次,以下就得到了用户连续登录的天数

SELECT id,newtime,count(newtime) rk
from
(SELECT *,DATE_SUB(time,INTERVAL num day) newtime
from
(SELECT id,time,row_number() over(partition by id order by time) num 
from
(SELECT id,date(date) time from sheet1 GROUP BY id ,time) a) a) a 
GROUP BY id,newtime

得到:
在这里插入图片描述

延伸问题1:连续登录三天

对上面的代码,继续嵌套

SELECT DISTINCT id
from
(SELECT id,newtime,count(newtime) rk
from
(SELECT *,DATE_SUB(time,INTERVAL num day) newtime
from
(SELECT id,time,row_number() over(partition by id order by time) num 
from
(SELECT id,date(date) time from sheet1 GROUP BY id ,time) a) a) a 
GROUP BY id,newtime) a
where rk=3

得到:
在这里插入图片描述
或者直接用having进行筛选,但是如果这个用户在很多段时间都连续登录3天,还需要再嵌套去重一下。

SELECT id,newtime,count(newtime) rk
from
(SELECT *,DATE_SUB(time,INTERVAL num day) newtime
from
(SELECT id,time,row_number() over(partition by id order by time) num 
from
(SELECT id,date(date) time from sheet1 GROUP BY id ,time) a) a) a 
GROUP BY id,newtime
having rk=3

得到:
在这里插入图片描述

延伸问题2:最大登录天数

SELECT DISTINCT id,max(rk)
from
(SELECT id,newtime,count(newtime) rk
from
(SELECT *,DATE_SUB(time,INTERVAL num day) newtime
from
(SELECT id,time,row_number() over(partition by id order by time) num 
from
(SELECT id,date(date) time from sheet1 GROUP BY id ,time) a) a) a 
GROUP BY id,newtime) a
GROUP BY id

得到:
在这里插入图片描述

  • 23
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值