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

HQL解决连续三天登陆问题

1.背景

统计连续登录天数超过3天的用户,输出信息包括:用户id,登录天数,起始时间,结束时间;

2.准备数据

-- 建表
create table if not exists user_login_3days(user_id STRING,login_date date
);--插入数据
insert into user_login_3days values ('01','2023-08-02');
insert into user_login_3days values ('01','2023-08-03');
insert into user_login_3days values ('01','2023-08-04');
insert into user_login_3days values ('01','2023-11-02');
insert into user_login_3days values ('01','2023-12-09');
insert into user_login_3days values ('02','2023-01-01');
insert into user_login_3days values ('02','2023-04-23');
insert into user_login_3days values ('03','2023-09-10');
insert into user_login_3days values ('03','2023-09-11');
insert into user_login_3days values ('03','2023-09-12');
insert into user_login_3days values ('04','2023-04-23');
insert into user_login_3days values ('04','2023-04-24');
insert into user_login_3days values ('05','2023-09-11');
insert into user_login_3days values ('06','2023-09-12');-- 查询数据数据
select * from user_login_3days order by user_id;

在这里插入图片描述

3.解决思路以及实现

思路1:row_number()

  • 1.通过对用户id进行开窗函数row_number,对登陆时间进行降序排列
  • 2.使用date_sub(login_date,rn)函数进行日期求出差值日期
  • 3.对user_id和diff_date分组求出时间的区间范围
  • 4.对结果进行过滤操作
SELECTt2.user_id,count(1)           as login_times,min(t2.login_date) as start_date,max(t2.login_date) as end_date
FROM
(SELECTt1.user_id,t1.login_date,date_sub(t1.login_date,rn) as diff_dateFROM(SELECTuser_id,login_date,row_number() over(partition by user_id order by login_date asc) as rnFROM user_login_3days) t1
) t2
group by t2.user_id, t2.diff_date
having login_times >= 3;

思路2:lag()/lead()

  • 1.通过对用户id进行开窗函数lag/lead,求出前面第二个的日期与当前的日期差以及后面一个日期与当前日期的差值
  • 2.对结果进行过滤操作
SELECTuser_id,lag_login_date,login_date
FROM(SELECTuser_id,login_date,lag(login_date,2,login_date) over(partition by user_id order by login_date) as lag_login_date,lead(login_date,1,login_date) over(partition by user_id order by login_date) as lead_login_dateFROM user_login_3days) t1
where datediff(login_date,lag_login_date) =2

4.总结

连续登陆问题解决的关键在于:如何判断连续?
通过对user_id分组排序后,使用登陆日期减去序号rn。如果连续,则得到的这个日期会相同。

http://www.lryc.cn/news/138214.html

相关文章:

  • (一)Docker简介(一篇足以)
  • RK3568 安卓源码编译
  • 第4篇:vscode+platformio搭建esp32 arduino开发环境
  • 2023前端面试笔记 —— CSS3
  • iOS 如何对整张图分别局部磨砂,并完全贴合
  • Packet_Tracer的使用
  • WPF如果未定义绑定的属性,程序如何处理
  • 韩国留学生生活之-租房篇,柯桥韩语培训留学韩语需要学到什么程度
  • 论文笔记:基于概念漂移的在线类非平衡学习系统研究
  • ubuntu22.04下rv1109 rootfs编译问题处理
  • Spring Boot Dubbo Zookeeper
  • 线程池的概念及实现原理
  • iOS App逆向之:iOS应用砸壳技术
  • 【高性能计算】opencl安装及相关概念
  • 盛最多水的容器——力扣11
  • 2023年高教社杯数学建模思路 - 复盘:校园消费行为分析
  • Flink_state 的优化与 remote_state 的探索
  • Kdab QML (part9)自由缩放时钟
  • Java网络编程(二)经典案例[粘包拆包]
  • 无分布式锁的ID生成
  • X2000 Linux UVC
  • HCIP-OpenStack组件之neutron
  • 数学建模-常见算法(3)
  • 缓存的设计方式
  • CH02_重构的原则(什么是重构、为什么重构、何时重构)
  • 26. 删除有序数组中的重复项(简单系列)
  • 【linux】基本指令(二)【man、echo、cat、cp】
  • 【视频】Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析|数据分享...
  • 2023年7月京东空气净化器行业品牌销售排行榜(京东运营数据分析)
  • 原生小案例:如何使用HTML5 Canvas构建画板应用程序