当前位置: 首页 > news >正文

SQL_连续登陆问题

文章目录

    • 方案1:使用ROW_NUMBER函数
      • 1、针对对数据user_id分组,根据用户的活动日期排序
      • 2、用登录日期与rn求date_sub,得到的差值日期如果是相等的,则说明这两天肯定是连续的
      • 3、根据user_id和日期差sub_date分组,登录次数即为分组后的count(1)
    • 方案2:使用lag和lead函数

方案1:使用ROW_NUMBER函数

  • 1、先对数据user_id分组,根据用户的活动日期排序
  • 2、用登录日期与rn求date_sub,得到的差值日期如果是相等的,则说明这两天肯定是连续的
    • 举例说,2023年1月1号、1月2号、1月3号;排名分别是1,2,3;现在用日期 - 排名 是不是都等于2022年12月31号
  • 3、根据user_id和日期差sub_date分组,登录次数即为分组后的count(1)

1、针对对数据user_id分组,根据用户的活动日期排序

selectuser_id,activity_date,ROW_NUMBER() over(partition by user_id order by activity_date) as rn
from user_activity

在这里插入图片描述

2、用登录日期与rn求date_sub,得到的差值日期如果是相等的,则说明这两天肯定是连续的

SELECTuser_id,activity_date,DATE_SUB(activity_date,INTERVAL rn DAY) as sub_date
from(selectuser_id,activity_date,ROW_NUMBER() over(partition by user_id order by activity_date) as rnfrom user_activity
)t1

在这里插入图片描述

3、根据user_id和日期差sub_date分组,登录次数即为分组后的count(1)

SELECTuser_id,min(activity_date) as min_date,max(activity_date)  as max_date,count(1) as  login_times
from(SELECTuser_id,activity_date,DATE_SUB(activity_date,INTERVAL rn DAY) as sub_datefrom(selectuser_id,activity_date,ROW_NUMBER() over(partition by user_id order by activity_date) as rnfrom user_activity)t1
)t2
group by user_id,sub_date
having login_times>=3;

在这里插入图片描述
从结果可以看出用户5,6,7,8存在连续登录3天及其以上的用户

方案2:使用lag和lead函数

  • 1、针对每个user_id,先使用lead函数将当前日期后后一天日期求出来
  • 2、针对每个用户,进行后一天的日期与当期日期相差值=1则属于连续登录。
    举例说,2023年1月1号、1月2号、1月3号;现在用日期2号 - 前后与它相差值2-1=1;3-2=1.是不是值都否为1呢。
  • 3、针对用户分组,datediff函数求出最大活动时间和最小活动时间的天数,求出>=3天的用户
WITH LoginDates AS (SELECT user_id, activity_date,LEAD(activity_date) OVER (PARTITION BY user_id ORDER BY activity_date) AS next_login_dateFROM user_activity
)
SELECT user_id
FROM LoginDates
WHERE DATEDIFF(activity_date, next_login_date) = 1
GROUP BY user_id
HAVING COUNT(*) >= 3;
http://www.dtcms.com/a/147326.html

相关文章:

  • 【前端Skill】点击目标元素定位跳转IDE中的源代码
  • LLM大模型中的基础数学工具—— 约束优化
  • 一个很简单的机器学习任务
  • 技术视界 | 开源新视野: 人形机器人技术崛起,开源社区驱动创新
  • 消息队列知识点详解
  • 基于RK3588+FPGA+AI YOLO的无人船目标检测系统(一)概述
  • 每天五分钟机器学习:凸优化
  • SBTI科学碳目标认证有什么要求?SBTI认证的好处?
  • MES系统中标签模板设计框架与实现思路
  • C++常用函数合集
  • 考研单词笔记 2025.04.21
  • qt画一朵花
  • elasticsearch7.15节点磁盘空间满了迁移数据到新磁盘
  • 【系统架构设计师】信息安全的概念
  • 每天学一个 Linux 命令(30):cut
  • OpenFeign 使用教程:从入门到实践
  • 线性代数-矩阵的秩
  • jvm-获取方法签名的方法
  • redis常用的五种数据类型
  • 如何使用UE Cesium插件实现网页端无算力负担访问?
  • Spring MVC 一个简单的多文件上传
  • 用自然语言指令构建机器学习可视化编程流程:InstructPipe 的创新探索
  • iTwin Tools函数拆解
  • Hiera:一款简洁的层次化视觉transformer
  • 基于SA模拟退火算法的车间调度优化matlab仿真,输出甘特图和优化收敛曲线
  • 楼宇自控怎样推动能源高效利用与建筑设备的科学管理
  • 【python】 循环语句(while)
  • 【Linux网络】应用层自定义协议与序列化
  • 10天学会嵌入式技术之51单片机-day-3
  • 文件的物理结构和逻辑结构的区分