用户连续登陆sql_【sql】最长连续登陆天数

姹紫嫣红

春风拂面

今天北京的风是格外的大

吹出了我隐藏多年的发际线

让我也再次看清楚了的体重仍需多吃点

不过不管怎么

通过刷题来讲解知识点,还是要继续保持的

即使清风徐来

先养眼,再看题

❤️

今天还是小姐姐镇楼

ad2fe81e9b5a05ff7fd2606c9bcbcb8e.png

本次我们主要讨论分组排序的问题

即row_number()函数

PS:其他的窗口函数以后再聊

dd987e3a41a4e02aca27e241f1d918ab.gif 8fae79e1102b0297b9c48b391b47b419.png e3be95ede944cb9a715dd257ec56e024.gif

0

Question

请用sql查询用户最长的登陆天数

(这道题貌似也算是经典题型,完全可以

上三年高考五年模拟那种)

原始数据

uidlogin_time
12020/1/1
12020/1/2
22020/1/2
22020/1/3
32020/1/3
12020/1/4
22020/1/4
12020/1/5
22020/1/5
12020/1/6
32020/1/6
32020/1/7

期望数据

uid最大连续登陆天数
13
24
32
5dd9855db05971b7927676eff6dc86a8.png

1

Answer

嘤嘤嘤~本来打算直接写答案,但考虑再三,

感觉可以从0开始写,

让小伙伴们能跟上我的思路。

1f951a914784562e8daf4b877c3f67c2.png

 step1

第一步:

获取每个用户的数据信息,

并按照时间进行排序 

使用row_number()窗口函数,

按uid分组,按照login_time排序 

SELECT    uid,    login_time,    row_number() OVER(PARTITION BY uid order by login_time) as rankFROM user_login

结果如下

(已经求出各个uid的以及登陆时间和连续值)

uidlogin_timerank
1

2020/1/1

1
12020/1/12
12020/1/13
12020/1/14
12020/1/15
22020/1/11
22020/1/12
22020/1/13
22020/1/14
32020/1/11
32020/1/12
32020/1/13
2326669ea45948cb1cf88348cdfee1b3.png

 step2

第二步:

开始判断是否连续

通过将login_time和rank相减法,

从而得出,是否连续

(如果不好理解的话,可通过结果找到规律) 

select  uid,  date_sub(login_time,rank) as login_sub,  min(login_time) as login_min,  max(login_time) as login_max,  count(1) as login_confrom (  -- 根据用户分组,按照时间进行排序(默认升序)    select       uid,      login_time,      row_number() OVER(PARTITION BY uid order by login_time) as rank    from user_login) agroup by uid,date_sub(login_time,rank)

结果如下

(已能够判断连续性和连续天数)

uid

login_sub

login_min

login_max

login_con

12019/12/312020/1/12020/1/22
12020/1/12020/1/42020/1/63
22020/1/12020/1/22020/1/54
32020/1/22020/1/32020/1/31
32020/1/42020/1/62020/1/72
58226d40c0ea1c1cf15ed6b944de7f39.png

 step3

第三步,

直接获取最大值通过uid分组,

获取最大的login_con

select uid,max(login_con) as login_max from (  select    uid,    date_sub(login_time,rank) as login_sub,    min(login_time) as login_min,    max(login_time) as login_max,    count(1) as login_con  from (    -- 根据用户分组,按照时间进行排序(默认升序)      select         uid,        login_time,        row_number() OVER(PARTITION BY uid order by login_time) as rank      from user_login  ) a  group by uid,date_sub(login_time,rank)) b group by uid

结果如下

(获取最大的连续天数)

uidlogin_max
13
24
32
0fe818a23c8e20759ed30f8215d96619.png 0c9f7d6f75f3c87b2957e75cc73939e6.png

扫码关注我

郭大熊的公众号

个人博客 : www.guodaxiong.com

如果不曾见过阳光,我本可以忍受黑暗

 Hi GuoDaXiong 

我是狗子

祝你幸福

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值