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

SQL--查询连续三天登录数据详解

问题: 现有用户登录记录表,请查询出用户连续三天登录的所有数据记录 

id           dt

1    2024-04-25 
1    2024-04-26 
1    2024-04-27
1    2024-04-28
1    2024-04-30
1    2024-05-01
1    2024-05-02
1    2024-05-04
1    2024-05-05
2    2024-04-25
2    2024-04-28
2    2024-05-02
2    2024-05-03
2    2024-05-04

期望结果:

 

先创建表并向hive中插入数据: 

create table user_log(
  id int,
  dt string
)
row format delimited
fields terminated by '\t';
load data local inpath '/home/hivedata/1107.txt' into table user_log;

--第一步  找出当前日期的后面的第三个日期(函数lead())和真正的三天后日期 (函数date_add())

lead():是一种窗口函数,用于在基于特定排序规则的结果集中,返回当前行之后的某一行(由用户指定偏移量)的指定列的值

date_add():核心功能是对日期进行加法运算。它接受一个日期值和一个时间间隔作为输入,然后返回在该日期基础上增加指定时间间隔后的日期


select *,lead(dt,2) over(partition by id order by dt) late3,date_add(dt,2) true3 from user_log;

查询结果: 

 

--第二步 比较这两个日期是否相等 ,判断当前日期是否是连续三天的

with t as (
    select *,lead(dt,2) over(partition by id order by dt) late3,date_add(dt,2) true3 from user_log
)
select *,if(late3 == true3,1,0) from t;

查询结果: 

 

--第三步 筛选出符合条件(连续登陆三天)的起始日期 

with t as (
    select *,lead(dt,2) over(partition by id order by dt) late3,date_add(dt,2) true3 from user_log
),t1 as (
    select *,if(late3 == true3,1,0) num from t
)
select * from t1 where num=1
;

查询结果:

 

--第四步 将查询出来的表与另一个一行有三条数据的表进行join

with t as (
    select *,lead(dt,2) over(partition by id order by dt) late3,date_add(dt,2) true3 from user_log
),t1 as (
    select *,if(late3 == true3,1,0) num from t
),t2 as (
    select * from t1 where num=1
),t3 as (
    select * from t2,(select explode(`array`(0,1,2)) add_day) a
)
select id,date_add(dt,add_day) `date` from t3 part
;

两表合并后的查询结果: 

 

 最终查询结果:

 

 


http://www.kler.cn/a/388808.html

相关文章:

  • LeetCode【0027】移除元素
  • arkUI:遍历数据数组动态渲染(forEach)
  • Vue7种组件之间通信方式
  • 探索 JNI - Rust 与 Java 互调实战
  • 扫雷游戏代码分享(c基础)
  • ODOO学习笔记(3):Odoo和Django的区别是什么?
  • Windows命令行常用快捷指令
  • react 组件应用
  • 电子电气架构 --- 基于以太网的车载网络协议的描述
  • PHP字符串变量
  • 【ARM】MDK-E203 Undefined identifier
  • 青少年编程与数学 02-003 Go语言网络编程 14课题、Go语言Udp编程
  • MFC中Excel的导入以及使用步骤
  • 模型 用户画像
  • 原子操作 std::atomic
  • M芯片Mac构建Dockerfile - 注意事项
  • 华为OD机试 - 称砝码 (Java 2024 E卷 100分)
  • 利用Langchain构建网页内容摘要Agent
  • 【日记】总感觉搞这些才回到了自己的老本行……(1179 字)
  • IDE使用技巧与插件推荐:提升开发效率的秘籍
  • 【01课_初识算法与数据结构】
  • 2024 United Kingdom and Ireland Programming Contest (AIKL)
  • 【初阶数据结构与算法】沉浸式刷题之顺序表练习(顺序表以及双指针两种方法)
  • 微服务mysql,redis,elasticsearch, kibana,cassandra,mongodb, kafka
  • 从0开始深度学习(25)——多输入多输出通道
  • Logrus入门