【SQL经典题目】连续日期判断、同时在线人数、会话划分、间隔日期连续、日期交叉

本文主要是介绍【SQL经典题目】连续日期判断、同时在线人数、会话划分、间隔日期连续、日期交叉,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【1.查询至少连续3天下单的用户】

思路1(使用lead):

  1. distinct user_id,create_date去重,确保每个用户每天只有一条访问记录
  2. lead(create_date,2,‘9999-12-31’) over(partition by user_id order by create_date)根据用户分区,订单日期排序,取后2行的订单日期(取不到则返回’9999-12-31’)
  3. 用datediff计算【订单日期】与【后2行订单日期】的差值,如果等于2则说明存在连续3天下单
    在这里插入图片描述
  4. 筛选出datediff等于2的记录,distinct user_id即可

思路2(使用row_number):

  1. distinct user_id,create_date去重,确保每个用户每天只有一条访问记录
  2. row_number() over(partition by user_id order by create_date)按用户分区,按访问日期排序,添加序号
  3. 每个日期与序号相减获得一个新的日期
    在这里插入图片描述
  4. group by user_id,diff对用户和新的日期进行分组,然后count()统计日期,判断count() >=3
    在这里插入图片描述

【2. 用户登录日志表user_id,visit_date 用sql查询出近30天连续访问7天以上的用户数量】
思路:

  1. 筛选近30天每个用户的访问记录,并去重确保同一个用户当天只有一条记录
  2. 对用户分组按访问日期排序,添加序号
  3. 每条记录的访问日期与对应的序号相减,获得一个新的日期字段
  4. group by用户,新的日期字段,统计个数,having筛选大于等于7
select user_id,diff,count(*) as cnt
from
(select user_id,visit_date,date_sub(visit_date,row_number() over(partition by user_id order by visit_date)) as difffrom (select distinct user_id,visit_date from table where visit_date >= date_sub(current_date,30)) t1
) t2
group by user_id,diff
having cnt >= 7

【3. 计算某段时间内同时在线人数最大值】
核心思路:

按时间排序,逐条处理(从上到下累加),获取每个时刻在线人数,取最大值

具体实现:

  1. 筛选出每个人的登陆记录并加一个字段1(id,登陆时间,1) union all 每个人的登出记录并加一个字段-1(id,登出时间,-1)
  2. 按照登陆/登出时间升序排序
  3. sum()并开窗,窗口范围首行到当前行,即计算累加值(此时数据表示了每一个时刻的在线总人数)
  4. max()计算累加值中的最大值(即同时在线人数最大值)

【4. 同一个用户相邻两次访问记录小于60s,则认为属于一个会话。现需对同一会话的访问记录增加会话id字段 】(会话划分问题)
核心思路:

按每个用户的会话时间排序,找到每个用户会话的起点并加标签1,不是起点则加标签0,同一用户对标签进行累加,每个用户不同会话则会有不同的标签

思路:

  1. 对每个用户开窗并按访问时间排序,用lag()取上一次访问时间,取不到上一条则默认为0
    在这里插入图片描述

  2. 每条访问记录减去上一次访问时间,差值>60则赋值1,否则赋值0(用1表示每个会话的起点)
    在这里插入图片描述

  3. 对每个用户开窗,窗口范围首行到当前行,用sum()进行累加
    在这里插入图片描述

  4. 用user_id拼接上累加值,表示每个会话
    在这里插入图片描述

【5. 用户登陆记录表(user_id,login_datetime),每行表达一个用户何时登陆,求各用户最长的连续登陆天数(间断1天也算连续)】(间断连续日期判断问题)
核心思路1:

用explode()将中间空1天的记录补充上,转化成连续日期的判断问题
(比如2条记录2021-12-03、2021-12-05 变成3条记录 2021-12-03、2021-12-04、2021-12-05)

思路1:

  1. 每个用户按照登陆日期去重
  2. 每个用户按登陆日期升序排列,用lead()取该用户下一次的登陆时间
    在这里插入图片描述
  3. 如果下次登陆日期和本次登陆日期相差为2,则用array()创建数组,包含本次登录日期、本次登录日期+1
    在这里插入图片描述
  4. 用explode()函数进行炸裂,此时就补充上了空缺日期
    在这里插入图片描述
  5. 按照【题目1】进行连续日期判断即可

核心思路2:

找到每次连续区间的起始日期,赋1,其它日期赋0,将问题转化为会话划分问题,取每个会话中的max日期-min日期,即为连续天数

思路2:

  1. 每个用户按照登陆日期去重
  2. 每个用户按登陆日期升序排列,用lag()取该用户上一次的登陆时间
    在这里插入图片描述
  3. 本次登录日期 减去 上次登录日期 >2的话则赋1,否则赋0
    在这里插入图片描述
  4. 对每个用户开窗,窗口范围首行到当前行,用sum()进行累加
    在这里插入图片描述
  5. 对每个用户、会话标签进行分组,取每个会话中max(login_date) - min(login_date) + 1即为最长连续天数。

【6.】(日期交叉问题)
核心思路:

思路1:

  1. 每个用户按照登陆日期去重

思路2:

这篇关于【SQL经典题目】连续日期判断、同时在线人数、会话划分、间隔日期连续、日期交叉的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/538047

相关文章

MySQL主从同步延迟问题的全面解决方案

《MySQL主从同步延迟问题的全面解决方案》MySQL主从同步延迟是分布式数据库系统中的常见问题,会导致从库读取到过期数据,影响业务一致性,下面我将深入分析延迟原因并提供多层次的解决方案,需要的朋友可... 目录一、同步延迟原因深度分析1.1 主从复制原理回顾1.2 延迟产生的关键环节二、实时监控与诊断方案

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl

MySQL数据库约束深入详解

《MySQL数据库约束深入详解》:本文主要介绍MySQL数据库约束,在MySQL数据库中,约束是用来限制进入表中的数据类型的一种技术,通过使用约束,可以确保数据的准确性、完整性和可靠性,需要的朋友... 目录一、数据库约束的概念二、约束类型三、NOT NULL 非空约束四、DEFAULT 默认值约束五、UN

MySQL 多表连接操作方法(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN)

《MySQL多表连接操作方法(INNERJOIN、LEFTJOIN、RIGHTJOIN、FULLOUTERJOIN)》多表连接是一种将两个或多个表中的数据组合在一起的SQL操作,通过连接,... 目录一、 什么是多表连接?二、 mysql 支持的连接类型三、 多表连接的语法四、实战示例 数据准备五、连接的性

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi