暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL脚本案例【1】连续登录3天的用户

皮皮克克 2024-01-18
85

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


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


结果集:




结束语:
Ok,就是本篇文章的全部内容了。
如果各位有不懂的地方,欢迎发消息给小编,小编会进行详细地解答。
最后,请屏幕前的各位吴彦祖和刘亦菲们,动动你们的小手,给小编一个

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

评论