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的MVCC多版本并发控制的实现
Apr 14 MySQL
MySQL Threads_running飙升与慢查询的相关问题解决
May 08 MySQL
Mysql中 unique列插入重复值该怎么解决呢
May 26 MySQL
详解MySQL多版本并发控制机制(MVCC)源码
Jun 23 MySQL
一篇文章带你深入了解Mysql触发器
Aug 02 MySQL
mysql中varchar类型的日期进行比较、排序等操作的实现
Nov 17 MySQL
防止web项目中的SQL注入
Dec 06 MySQL
SQL语法CONSTRAINT约束操作详情
Jan 18 MySQL
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
Apr 18 MySQL
Mysql查询时间区间日期列表,不会由于数据表数据影响
Apr 19 MySQL
MySQL索引 高效获取数据的数据结构
May 02 MySQL
MySQL数据库安装方法与图形化管理工具介绍
May 30 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 获取可变函数参数的函数
2009/08/26 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
PHP进阶学习之依赖注入与Ioc容器详解
2019/06/19 PHP
使用 JScript 创建 .exe 或 .dll 文件的方法
2011/07/13 Javascript
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
Javascript表格翻页效果的具体实现
2013/10/05 Javascript
php析构函数的具体用法小结
2014/03/11 Javascript
使用js画图之饼图
2015/01/12 Javascript
JS表的模拟方法
2015/02/05 Javascript
CSS3实现动态背景登录框的代码
2015/07/28 Javascript
javascript字符串函数汇总
2015/12/06 Javascript
JavaScript实现经典排序算法之选择排序
2016/12/28 Javascript
JS限制输入框输入的实现代码
2018/07/02 Javascript
ng-repeat指令在迭代对象时的去重方法
2018/10/02 Javascript
CryptoJS中AES实现前后端通用加解密技术
2018/12/18 Javascript
vue draggable resizable gorkys与v-chart使用与总结
2019/09/05 Javascript
vue项目引入ts步骤(小结)
2019/10/31 Javascript
node省市区三级数据性能测评实例分析
2019/11/06 Javascript
如何使用Javascript中的this关键字
2020/05/28 Javascript
[53:23]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
[46:37]LGD vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python文本相似性计算之编辑距离详解
2016/11/28 Python
浅谈Python中的私有变量
2018/02/28 Python
python-docx修改已存在的Word文档的表格的字体格式方法
2018/05/08 Python
Python绘制KS曲线的实现方法
2018/08/13 Python
Python3 导入上级目录中的模块实例
2019/02/16 Python
Charles&Keith美国官方网站:新加坡快时尚鞋类和配饰零售商
2019/11/27 全球购物
战友聚会策划方案
2014/06/13 职场文书
2014年教师节国旗下讲话稿
2014/09/10 职场文书
民用住房租房协议书
2014/10/29 职场文书
三好学生评语大全
2014/12/29 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
解决go在函数退出后子协程的退出问题
2021/04/30 Golang
简述Java中throw-throws异常抛出
2021/08/07 Java/Android
Java字符串逆序方法详情
2022/03/21 Java/Android