大厂面试,或者做一些用户活跃数据的工作经常会和连续登录日期打交道。
今天来看看这种问题的解题思路。
1.用户当日登陆多次的情况下,首先需要根据用户登陆日期到yyyymmdd粒度进行去重。
得到如下模拟表样进行我们后面的解题:
2.去重之后,我们首先根据用户和日期进行开窗,得到一个按日期排名的顺序号:
select t.*, rank() over(partition by t.id order by t.login_date) rk
from LOGIN_INF t
执行后结果如下:
3.使用登陆日期减去我们rank的结果(降序则加)
得到一个日期标识:
select id, login_date, login_date - rk date_flag
from (select t.*, rank() over(partition by t.id order by t.login_date) rk
from LOGIN_INF t)
执行结果如下:
4.根据用户和得到的日期标识进行聚合函数统计:
select id, date_flag, count(*) last_day
from (select id, login_date, login_date - rk date_flag
from (select t.*,
rank() over(partition by t.id order by t.login_date) rk
from LOGIN_INF t))
group by id, date_flag
得到结果如下:
最后再嵌套一层max就能求出最大连续登陆天数了。
这种问题还有其他的解题思路,但目前我个人推荐这个嵌套的解决方案,其他方案比如拉链表之类的比较麻烦和耗性能,比较难想明白,如果有其他简单方案也欢迎评论区讨论。