SQL笔试题
下面的SQL基于PostgreSQL
1.用户连续登录天数
背景描述
现在我们有一张用户登录日志表,记录用户每天的登录时间,我们想要统计一下,用户每次连续登录的开始日期和结束日期,以及连续登录天数。
用户ID | 登录日期 |
---|---|
1001 | 2017-01-01 |
1001 | 2017-01-02 |
1001 | 2017-01-04 |
1001 | 2017-01-06 |
1002 | 2017-01-02 |
1002 | 2017-01-03 |
同学们先思考下,整理下思路,如果没有思路或者某几个点不了解,就可以继续往下看了。
测试数据
|
|
步骤拆解
我们首先要思考,怎样才算连续登录呢?就是1号登录,2号也登录了,这样就连续2天登录,那我们怎么知道2号他有没有登录呢?
一种思路是根据排序来判断:
我们来根据日期来排个名
现在,我们根据用户ID,对他的登录日期做了排序,但是我们还是没有办法知道,他是不是连续的。
我们根据这个排序再思考一下,对于一个用户来说,他的登录日期排序已经是连续的了,如果登录日期也是个数字,那我们根据每行的差值,就可以判断登录日期是否连续了。
我们换个角度,我们找一个起始日期,来计算一个相差的天数,用它去和排序相对比,就可以了。
我们观察下数据,因为日期排序是连续的,我们统计的间隔天数都是一个起始日期,所以,如果登录日期是连续的,那么,排序-间隔天数的差值也应该是一样的
|
|
差值一样的记录,就是连续登录的日期
好了,连续登录的判断标准,我们已经确定了,下面就是把题目中要的数据查出来即可
拓展:获取用户最大的连续登录天数及开始日期和结束日期
|
|
连续5天登录用户
这里补充另一个类似的问题,这里,我们想看连续登录5天的用户,使用上面的方法可以实现,这里介绍一个更快的方法:
是使用一个函数
这样取连续登录的话,比较方便
思考题:连续7天未登录用户
这里留一个类似的小问题,大家自行练习下
小结
我们简单整理下思路,上面的例子,我认为主要是一个思路的介绍,核心就是我们要找到一个判断连续的方法,找到方法后,SQL自然就一步一步想出来了。
上面只是一种思路,一定还有更优的解法,欢迎大家反馈分享。