求用户最大连续登陆天数mysql实现
用户连续登陆
- 一、规定时间内用户最大连续登陆天数
- 二、user_login表字段(所有用户登陆信息)
- 三、分解步骤
- 1.where初步筛选
- 2.窗口函数分组排序
- 4.计算获得连续的字段
- 5.分组计算连续天数
- 6.求得结果
- 7.连续SQL
- 8.使用函数总结
- (1)timestampdiff(unit, start, end)
- (2)窗口函数排序
- (3)date_sub()
一、规定时间内用户最大连续登陆天数
为了看有哪些忠实用户,积极使用产品,需要计算用户的连续登陆天数。
二、user_login表字段(所有用户登陆信息)
user_id | login_time |
---|---|
valk | ‘2021-08-08 18:30:20’ |
zaa | ‘2021-08-07 18:30:20’ |
zb | ‘2019-09-07 18:30:20’ |
三、分解步骤
1.where初步筛选
首先使用timestampdiff(unit, begin, end) <= 30进行where的条件筛选,得到新表t_1
-- t_1表
select user_id, log_time
from user_login
where timestampdiff(day, login_time, now()) <= 30;
这样符合条件数据就出来了
user_id | login_time |
---|---|
valk | ‘2021-08-08 18:30:20’ |
zaa | ‘2021-08-07 18:30:20’ |
2.窗口函数分组排序
使用row_number() over(partition by order by )进行排序。
得到一个按user_id分组并有排序编号的新表t_2
-- t_2表
select user_id, date(login_time) as login_daterow_number() over(partition by user_id, order by login_time ascending) as rank
from t_1
t_2表
user_id | login_date | rank |
---|---|---|
valk | 2021-08-08 | 1 |
valk | 2021-08-09 | 2 |
valk | 2021-08-10 | 3 |
valk | 2021-08-11 | 4 |
zaa | 2021-08-07 | 1 |
zaa | 2021-08-20 | 2 |
zaa | 2021-08-22 | 3 |
4.计算获得连续的字段
通过观察可以发现,若同组用户login_date是连续的,分别减去rank后所得到的结果是一样的,2021-08-08 - 1 = 2021-08-07,2021-08-09 - 2 = 2021-08-07等等。使用date_sub函数获得新的列gap和新表t_3
-- t_3
select user_id, login_date,date_sub(login_date, interval rank day) as gap
from t_2
t_3表
user_id | login_date | gap |
---|---|---|
valk | 2021-08-08 | 2021-08-07 |
valk | 2021-08-09 | 2021-08-07 |
valk | 2021-08-10 | 2021-08-07 |
valk | 2021-08-11 | 2021-08-07 |
zaa | 2021-08-07 | 2021-08-06 |
zaa | 2021-08-20 | 2021-08-18 |
zaa | 2021-08-22 | 2021-08-19 |
5.分组计算连续天数
此时对t_3表按user_id、gap进行分组,并对组内的login_date进行count计数,得到表t_4
-- t_4
select user_id, gap, count(login_date) as num
from t_3
group by user_id, gap
t_4表
user_id | gap | num |
---|---|---|
valk | 2021-08-07 | 4 |
zaa | 2021-08-06 | 1 |
zaa | 2021-08-18 | 1 |
zaa | 2021-08-19 | 1 |
6.求得结果
最后按照user_id进行分组,使用max取出最大的num
select user_id, max(num) as series_login -- 按user_id分组,求最大连续登陆天数
from t_4
group by user_id
user_id | series_login |
---|---|
valk | 4 |
zaa | 1 |
终于我们求出了,近30天内,valk用户最大连续登陆4天,zaa最大连续登陆1天。
7.连续SQL
-- sql_4_start
select user_id, max(num) as series_login
from
(-- sql_3_start:按user_id, date_sub结果分组,计数求得连续登陆天数 num
select user_id, gap, count(login_time) as num
from
(-- sql_2_start:主要求出data_sub的结果,结果相同则代表连续登陆
select user_id, login_time,date_sub(login_time, interval rank day) as gap
from
(-- sql_1_start:where 筛选出30天内的数据, row_number 进行分组排序,得出t_1表
select user_id,login_time,row_number() over(partition by user_id, order by login_time ascending) as rank
from user_login
where timestampdiff(day, login_time, now()) <= 30 -- sql_1_end
) as t_1 -- sql_2_end) as t_2 group by user_id, gap -- sql_3_end) as t_3 group by user_id --sql_4_end
8.使用函数总结
(1)timestampdiff(unit, start, end)
where timestampdiff(unit, datetime_start, datetime_end) <= 30;
-- unit 包含datetime_end 减 datetiem_start 的结果的单位,有大小正负区别
-- unit主要包括 year, month, week, day, hour, minute, second
(2)窗口函数排序
例如对10,20,30,30,50 五个数字升序排序
row_number() over(partition by column, order by column ascending/descending)
partition by 指按何列进行分组,order by 指按何列进行升序/降序排序
函数名 | 属性 | 排序数字 | 排序结果 |
---|---|---|---|
row_number() | 连续,不重复 | 10,20,30,30,50 | 1,2,3,4,5 |
rank() | 重复,不连续 | 10,20,30,30,50 | 1,2,3,3,5 |
dense_rank() | 连续且重复 | 10,20,30,30,50 | 1,2,3,3,4 |
(3)date_sub()
date_sub(date, interval expr type),指从相应日期date 减去 expr 的时间数量
type 可以是year, month, week, day, hour, minute, second 等
求用户最大连续登陆天数mysql实现相关推荐
- SQL计算QQ连续登陆天数
最近遇到一个SQL查询需求:计算QQ连续登陆天数? 连续登陆天数不间断,如果有一天没登陆就重新计算. 数据准备 mysql> create table user_login(user_id in ...
- SQL求用户的最大连续登陆天数
建表插入数据 create table tmp_continous (id STRING ,time DATETIME );INSERT OVERWRITE TABLE tmp_continous S ...
- mysql 连续签到天数_获取连续登陆天数,连续签到天数 ,方法优化
获取连续登陆天数,连续签到天数,类似这样的需求应该是一个常见的需求,那么我们有没有一套成熟的解决方案呢 ?下面我来跟大家分享一下我的故事. 在猴年马月的一天,有个用户反馈个人中心打开缓慢,需要7.8秒 ...
- HIVE面试题原理详解 统计用户连续交易的总额、连续登陆天数、连续登陆开始和结束时间、间隔天数
HIVE面试题原理详解 统计用户连续交易的总额.连续登陆天数.连续登陆开始和结束时间.间隔天数 友情提示 创建数据表 添加数据 流程图 第一步分析(子表a) 第二步分析(子表b) 第三步分析(子表c) ...
- SQL查询用户的最长连续登陆天数
题目重点:连续 设表名字:user_login 第一步:使用ROW_NUMBER() 窗口函数 按UID分组,按date1升序排 -- 第一段首先根据用户分组,登陆时间排序,结果按照登陆时间升序排列 ...
- SQL计算连续登陆天数大于等于3天的用户
其中给出了用户(id)和用户登陆时间(dt)两列 其中要处理把登陆时间截取到日,然后根据id和登陆时间dt进行去重,然后得到如下的数据集 再进行下面的代码 select id, sdate, edat ...
- 如何统计连续(连续登陆天数,连续学习天数,连续购买天数)
直接来看实战,现在有一张表t,这张表存储了每个员工每天的打卡情况,现在需要统计截止目前每个员工的连续打卡天数,表t如下表所示: uid tdate is_flag 1 2020/2/ ...
- 超详细解析:用sql查找连续登陆7天或者登陆天数最多的用户id
# 方法一:查询连续登陆7天的用户id和登陆天数 -- 第一步:用户登录日期去重 select distinct date(date) as 日期,id from tb_user; -- 第二步:用r ...
- TSQL--查找连续登陆用户
--========================================== 需求:有一个用户登陆日志表,记录用户每次登陆时间,然后想查找用户按天连续登陆的情况,找出每次连续登陆的最早时间 ...
最新文章
- 从0梳理1场CV缺陷检测赛事!
- FPGA 时序约束系列之周期约束
- 关于网页显示乱码问题的一些个人见解(PHP、JSP...)
- 本机的计算机管理员,c# 获得本机计算机名字,获得本机当前系统登陆用户和管理员权限,Environment...
- .NET生态现状:超一半 .NET开发者使用C# 8、.NET Framework使用量减少
- gitee 从 拉取新分支到本地_Hexo博客详细教程(一)| 建立本地站点
- python链表实现栈_使用python实现数组、链表、队列、栈
- 全局变量,extern和static以及命名空间的区别
- python-虚拟环境的作用
- Python 3 Basics
- 企业级MySQL数据库备份方案:增量备份、全量备份、逻辑备份
- SQL ltrim() 和 rtrim() 函数
- 红帽子 linux 声卡驱动,RedHat Linux系统下安装ALSA驱动的方法
- [含论文+任务书+中期检查表+答辩PPT+源码等]基于javaweb的政府机关公文收发系统
- 872. 叶子相似的树 / 剑指 Offer 33. 二叉搜索树的后序遍历序列 / 剑指 Offer 34. 二叉树中和为某一值的路径 / 剑指 Offer 35. 复杂链表的复制
- excel表格如何转换成word表格_告诉你如何将excel表格转换成word文档
- ORACLE等待事件相关
- 华东师大在职计算机分数线,报考华东师范大学在职研究生分数线是多少呢?
- 18天精读掌握《费曼物理学讲义卷一》 第14天 2019/6/30
- 618 线上摆摊 | 看直播 领京豆