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 用户权限管理实现
May 25 MySQL
MySQL开启事务的方式
Jun 26 MySQL
MySQL系列之十二 备份与恢复
Jul 02 MySQL
SQL优化老出错,那是你没弄明白MySQL解释计划用法
Nov 27 MySQL
MySQL的InnoDB存储引擎的数据页结构详解
Mar 03 MySQL
MySQL Server 层四个日志
Mar 31 MySQL
Mysql多层子查询示例代码(收藏夹案例)
Mar 31 MySQL
进阶篇之linux环境下安装MySQL数据库
Apr 09 MySQL
MySQL分区以及建索引的方法总结
Apr 13 MySQL
解决MySQL报“too many connections“错误
Apr 19 MySQL
MySQL提升大量数据查询效率的优化神器
Jul 07 MySQL
MySQL添加索引特点及优化问题
Jul 23 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
解析phpstorm + xdebug 远程断点调试
2013/06/20 PHP
Smarty变量调节器失效的解决办法
2014/08/20 PHP
PHP实现将视频转成MP4并获取视频预览图的方法
2015/03/12 PHP
php输出含有“#”字符串的方法
2017/01/18 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
2017/03/15 PHP
实例分析10个PHP常见安全问题
2019/07/09 PHP
基于jQuery图片平滑连续滚动插件
2009/04/27 Javascript
extjs 学习笔记(三) 最基本的grid
2009/10/15 Javascript
Javascript解决常见浏览器兼容问题的12种方法
2010/01/04 Javascript
jquery validation插件表单验证的一个例子
2010/03/03 Javascript
使用jQuery模板来展现json数据的代码
2010/10/22 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
JS实现仿QQ聊天窗口抖动特效
2015/05/10 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
2016/10/10 Javascript
bootstrap提示标签、提示框实现代码
2016/12/28 Javascript
原生js实现轮播图的示例代码
2017/02/20 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
浅谈react前后端同构渲染
2017/09/20 Javascript
微信小程序实现跳转的几种方式总结(推荐)
2019/04/24 Javascript
vue中axios实现数据交互与跨域问题
2019/05/12 Javascript
js实现多个标题吸顶效果
2020/01/08 Javascript
[00:35]DOTA2上海特级锦标赛 EG战队宣传片
2016/03/04 DOTA
利用Python中的输入和输出功能进行读取和写入的教程
2015/04/14 Python
Python实现简单多线程任务队列
2016/02/27 Python
python中字符串的操作方法大全
2018/06/03 Python
使用Python机器学习降低静态日志噪声
2018/09/29 Python
基于python实现把图片转换成素描
2019/11/13 Python
Python高级property属性用法实例分析
2019/11/19 Python
Python TKinter如何自动关闭主窗口
2020/02/26 Python
荷兰演唱会和体育比赛订票网站:viagogo荷兰
2018/04/08 全球购物
什么是属性访问器
2015/10/26 面试题
入党积极分子学习党的纲领思想汇报
2014/09/13 职场文书
银行优秀员工推荐信
2015/03/24 职场文书
二年级数学教学反思
2016/02/16 职场文书