MySQL 计算连续登录天数


Posted in MySQL onMay 11, 2022

MySQL计算连续登录天数


建表、insert数据

create table tmp_login (
  user_id int(11) ,
  login_date datetime
);

insert into tmp_login values(2,'2020-05-29 11:12:12');
insert into tmp_login values(2,'2020-05-29 15:12:12');
insert into tmp_login values(2,'2020-05-30 11:12:12');
insert into tmp_login values(2,'2020-05-31 11:12:12');
insert into tmp_login values(2,'2020-06-01 11:12:12');
insert into tmp_login values(2,'2020-06-02 11:12:12');
insert into tmp_login values(2,'2020-06-03 11:12:12');
insert into tmp_login values(2,'2020-06-04 11:12:12');
insert into tmp_login values(2,'2020-06-05 11:12:12');
insert into tmp_login values(2,'2020-06-06 11:12:12');
insert into tmp_login values(2,'2020-06-07 11:12:12');
insert into tmp_login values(7,'2020-06-01 11:12:12');
insert into tmp_login values(7,'2020-06-02 11:12:12');
insert into tmp_login values(7,'2020-06-03 11:12:12');
insert into tmp_login values(7,'2020-06-05 11:12:12');
insert into tmp_login values(7,'2020-06-06 11:12:12');
insert into tmp_login values(7,'2020-06-07 11:12:12');
insert into tmp_login values(7,'2020-06-08 11:12:12');

方法一 row_number()

  1. 查询所有用户的每日登录记录
select distinct user_id, date(login_date) as days 
from tmp_login;

MySQL 计算连续登录天数

  1. row_number()计算登录时间排序
select user_id, days, row_number() over(partition by user_id order by days) as rn
from (
	select distinct user_id, date(login_date) as days from tmp_login) t1;

MySQL 计算连续登录天数

  1. 用登录时间 - row_number(),如果得到的日期相同,则认为是连续登录日期
select *, date_sub(days, interval rn day) as  results
from(
	select user_id, days, row_number() over(partition by user_id order by days) as rn
	from (
		select distinct user_id, date(login_date) as days from tmp_login) t1
) t2;

MySQL 计算连续登录天数
4. 按user_id、results分组就可得出连续登录天数

select user_id, count(*) as num_days
from (
	select *, date_sub(days, interval rn day) as  results
	from(
		select user_id, days, row_number() over(partition by user_id order by days) as rn
		from (
			select distinct user_id, date(login_date) as days from tmp_login) t1
	) t2) t3
group by user_id , results;

MySQL 计算连续登录天数
直接用日期减去row_number(),不用date_sub的话,遇到登录日期跨月时会计算错误,

方法二lead() 或 lag()

这种情况适合的场景是,需要查找连续登录超过n天的用户,n为确定值
如果n为4,即计算连续登录超过4天的用户

-- lead计算连续登录
select distinct user_id 
from(
	select user_id, days, datediff(lead(days, 3, '1970-01-01') over(partition by user_id order by days), days)as results
	from (
		select distinct user_id, date(login_date) as days from tmp_login) t1) t2
where results = 3;

连续登录4天,则日期差应该为3。

MySQL 相关文章推荐
mysql对于模糊查询like的一些汇总
May 09 MySQL
MySQL中distinct和count(*)的使用方法比较
May 26 MySQL
Mysql 设置boolean类型的操作
Jun 04 MySQL
详细聊聊MySQL中慢SQL优化的方向
Aug 30 MySQL
MySQL中的引号和反引号的区别与用法详解
Oct 24 MySQL
MySQL磁盘碎片整理实例演示
Apr 03 MySQL
mysql使用instr达到in(字符串)的效果
Apr 03 MySQL
MySQL数据库之存储过程 procedure
Jun 16 MySQL
浅谈MySql update会锁定哪些范围的数据
Jun 25 MySQL
MySQL的意向共享锁、意向排它锁和死锁
Jul 15 MySQL
MySQL池化框架学习接池自定义
Jul 23 MySQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
May 08 MySQL
mysql 获取相邻数据项
May 11 #MySQL
MySQL脏读,幻读和不可重复读
May 11 #MySQL
MySql数据库 查询时间序列间隔
May 11 #MySQL
Mysql中常用的join连接方式
May 11 #MySQL
MySQL的prepare使用以及遇到的bug
May 11 #MySQL
MySQL批量更新不同表中的数据
May 11 #MySQL
mysql查找连续出现n次以上的数字
May 11 #MySQL
You might like
php download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
提高PHP编程效率的53个要点(经验小结)
2010/09/04 PHP
分享8个最佳的代码片段在线测试网站
2013/06/29 PHP
php程序员应具有的7种能力小结
2014/11/27 PHP
php 批量查询搜狗sogou代码分享
2015/05/17 PHP
PHP中Closure类的使用方法及详解
2015/10/09 PHP
关于js datetime的那点事
2011/11/15 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
JS对字符串编码的几种方式使用指南
2015/05/14 Javascript
JS仿百度自动下拉框模糊匹配提示
2016/07/25 Javascript
jQuery实现复制到粘贴板功能
2017/02/11 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
解决vue组件中使用v-for出现告警问题及v for指令介绍
2017/11/11 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
2019/08/20 Javascript
Element Backtop回到顶部的具体使用
2020/07/27 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
2020/10/30 Javascript
[50:29]2014 DOTA2华西杯精英邀请赛 5 24 DK VS iG
2014/05/26 DOTA
[49:40]2018DOTA2亚洲邀请赛小组赛 A组加赛 TNC vs Newbee
2018/04/03 DOTA
[55:56]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
[51:15]完美世界DOTA2联赛PWL S2 PXG vs Magma 第一场 11.21
2020/11/24 DOTA
跟老齐学Python之list和str比较
2014/09/20 Python
列举Python中吸引人的一些特性
2015/04/09 Python
通过Python使用saltstack生成服务器资产清单
2016/03/01 Python
python3写爬取B站视频弹幕功能
2017/12/22 Python
python验证身份证信息实例代码
2019/05/06 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
2020/03/08 Python
python爬取音频下载的示例代码
2020/10/19 Python
使用CSS3实现字体颜色渐变的实现
2020/08/10 HTML / CSS
Sixt美国租车:高端豪华车型自驾体验
2017/09/02 全球购物
机电专业毕业生求职信
2013/10/27 职场文书
军校制空专业毕业生自我鉴定
2013/11/16 职场文书
英语自荐信范文
2013/12/11 职场文书
纪检干部现实表现材料
2014/08/21 职场文书
个人年终总结怎么写
2015/03/09 职场文书
工人先锋号事迹材料(2016精选版)
2016/03/01 职场文书
nginx代理实现静态资源访问的示例代码
2022/07/07 Servers