SQL-查询用户最长连续登陆天数
sql经典题型:求用户连续登陆的最长天数
已知:一个简单的用户登陆表:
uid | dat |
---|---|
u1 | 2019/9/1 |
u1 | 2019/9/2 |
u1 | 2019/9/3 |
u1 | 2019/9/8 |
u1 | 2019/9/9 |
u2 | 2019/9/2 |
u2 | 2019/9/3 |
想要得到:查询结果如下
uid | max_day |
---|---|
u1 | 3 |
u1 | 2 |
u2 | 2 |
题目难点:如何求连续登陆的天数
- 首先想到的是用 COUNT + GROUP BY 的用法,那么GROUP BY后面用于分组的条件就是连续登陆的标记(分别为连续登陆2天,3天,6天,10 天等等)。
- 如何对于每一个用户构建连续登陆的标记? 这个时候,很容易就会想到平时算法中的相邻循环加1,但是在SQL中一定要转变这种思维方式,而是思考能不能给这些连续加1的日期打上一个相同的标签,这样子就可以利用这个标签当作GROUP BY分组的条件了。
- 以用户U1为例,该用户有两次连续登陆的经历,第一次是连续3天,第二次是连续2天,我们只要能对这两次的连续登陆行为打上两个标签,则可以使用GROUP BY对于不同标签组内的数据进行COUNT的计算,从而得到用户的连续登陆天数这一新变量。
- 以用户U1连续登陆3天的3个数据为例,怎么给着三个数据打上同样的标签呢?此时我们思考,这三个数据DATE1,DATE2,DATE3的关系是数值上依次加1,加入我们可以生成一列同样依次加1的数据R1,R2,R3(如1,2,3),那么DATE1-R1的差值就会等于DATE2-R2