点击关注公众号,干货第一时间送达

hello,大家好
小编我,回来了!
这一期开始,
小编将带来全新系列:SQL脚本
给大家演示各种经典的SQL案例,
不管是在工作,还是面试中,
都有可能遇到的
一起来看看。
一,需求场景
问:
请通过SQL的方式,筛选出表格中连续登录3天的用户。
表格数据已经给出:

二,解决方案
不同的数据库,会有不同的库函数,
本题小编以Mysql8为例,进行演示。
(1)我们可以对数据,按照用户进行分组,且组内排序
SELECT
user_name,
login_date as loginDate,
ROW_NUMBER() over(PARTITION by user_name ORDER BY login_date) as rn
FROM user_login_record
结果集:

友情提示:Mysql5里面没有 row_number() 函数,也没有 over() 开窗函数
(2)然后用每条数据中的日期字段,减去排序的序号,如果有连续的日期,则出现结果是相同的
SELECT
t1.user_name as userName,
DATE(DATE_SUB(t1.loginDate, Interval t1.rn DAY)) AS flagDate
from
(
SELECT
user_name,
login_date as loginDate,
ROW_NUMBER() over(PARTITION by user_name ORDER BY login_date) as rn
FROM user_login_record
) t1
结果集:

(3)最后,计算每个组内,相同 flagDate 的个数,大于等于3的,就是连续登录3天的用户了
SELECT
t2.userName
FROM(
SELECT
t1.user_name as userName,
DATE(DATE_SUB(t1.loginDate, Interval t1.rn DAY)) AS flagDate
from
(
SELECT
user_name,
login_date as loginDate,
ROW_NUMBER() over(PARTITION by user_name ORDER BY login_date) as rn
FROM user_login_record
) t1
) t2
GROUP BY userName, flagDate
HAVING COUNT(flagDate) >= 3
结果集:


文章转载自皮皮克克,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




