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

sql 复制代码
select *,lead(dt,2) over(partition by id order by dt) late3,date_add(dt,2) true3 from user_log;

查询结果:

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

sql 复制代码
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;

查询结果:

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

sql 复制代码
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

sql 复制代码
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
;

两表合并后的查询结果:

最终查询结果:

相关推荐
Gauss松鼠会11 分钟前
【GaussDB】在duckdb中查询GaussDB的数据
数据库·sql·database·gaussdb
虹科网络安全37 分钟前
艾体宝洞察 | Redis vs ElastiCache:哪个更具成本效益?
数据库·redis·缓存
自在极意功。41 分钟前
MyBatis 动态 SQL 详解:从基础到进阶实战
java·数据库·mybatis·动态sql
老邓计算机毕设43 分钟前
SSM校园订餐系统7z0dm(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·菜品管理系统·ssm 框架·ssm 框架开发·校园线上订餐平台
sxlishaobin1 小时前
MySQL- explain
数据库·mysql
〝七夜5691 小时前
SQL之sql注入
sql
曹牧1 小时前
Oracle:判断一个字符串出现次数
数据库·oracle
源代码•宸1 小时前
Leetcode—620. 有趣的电影&&Q3. 有趣的电影【简单】
数据库·后端·mysql·算法·leetcode·职场和发展
快乐肚皮2 小时前
MySQL递归CTE
java·数据库·mysql·递归表达式
2301_800256112 小时前
地理空间数据库中的CPU 和 I/O 开销
数据库·算法·oracle