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入门命令之函数-单行函数-流程控制函数
Apr 05 MySQL
mysql字符串截取函数小结
Apr 05 MySQL
Mysql基础知识点汇总
May 26 MySQL
Mysql数据库命令大全
May 26 MySQL
MySQL查看表和清空表的常用命令总结
May 26 MySQL
详解MySQL中的主键与事务
May 27 MySQL
浅谈MySQL之select优化方案
Aug 07 MySQL
MySQL实例精讲单行函数以及字符数学日期流程控制
Oct 15 MySQL
一条 SQL 语句执行过程
Mar 17 MySQL
MYSQL如何查看操作日志详解
May 30 MySQL
sql注入报错之注入原理实例解析
Jun 10 MySQL
Mysql数据库group by原理详解
Jul 07 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
Amazon Prime Video平台《无限住人 -IMMORTAL-》2020年开始TV放送!
2020/03/06 日漫
怎样辨别一杯好咖啡
2021/03/03 新手入门
php实现读取内存顺序号
2015/03/29 PHP
浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
2016/12/15 PHP
laravel5.1 ajax post 传值_token示例
2019/10/24 PHP
php使用redis的几种常见操作方式和用法示例
2020/02/20 PHP
实现png图片和png背景透明(支持多浏览器)的方法
2009/09/08 Javascript
尝试在让script的type属性等于text/html
2013/01/15 Javascript
jquery 无限级联菜单案例分享
2013/03/26 Javascript
判断及设置浏览器全屏模式
2014/04/20 Javascript
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
JS+DIV实现鼠标划过切换层效果的方法
2015/05/25 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
JS中数组重排序方法
2016/11/11 Javascript
Vue-cli@3.0 插件系统简析
2018/09/05 Javascript
浅谈python和C语言混编的几种方式(推荐)
2017/09/27 Python
python利用有道翻译实现"语言翻译器"的功能实例
2017/11/14 Python
python遍历文件夹下所有excel文件
2018/01/03 Python
Java实现的执行python脚本工具类示例【使用jython.jar】
2018/03/29 Python
python组合无重复三位数的实例
2018/11/13 Python
pandas修改DataFrame列名的实现方法
2019/02/22 Python
详解Python中的正斜杠与反斜杠
2019/08/09 Python
python实现无边框进度条的实例代码
2020/12/30 Python
纯css3实现的鼠标悬停动画按钮
2014/12/23 HTML / CSS
青春励志演讲稿
2014/04/29 职场文书
党员先锋岗事迹材料
2014/05/08 职场文书
关于保护环境的标语
2014/06/09 职场文书
一份教室追逐打闹的检讨书
2014/09/27 职场文书
党员群众路线个人整改措施思想汇报
2014/10/12 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
乡镇安全生产月活动总结
2015/05/08 职场文书
Django使用redis配置缓存的方法
2021/06/01 Redis
Vue.js中v-for指令的用法介绍
2022/03/13 Vue.js
MySQL新手入门进阶语句汇总
2022/09/23 MySQL