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 相关文章推荐
浅析InnoDB索引结构
Apr 05 MySQL
浅谈Mysql多表连接查询的执行细节
Apr 24 MySQL
详解MySQL主从复制及读写分离
May 07 MySQL
MySQL查询学习之基础查询操作
May 08 MySQL
my.ini优化mysql数据库性能的十个参数(推荐)
May 26 MySQL
MYSQL(电话号码,身份证)数据脱敏的实现
May 28 MySQL
MYSQL 无法识别中文的永久解决方法
Jun 03 MySQL
Mysql数据库值的添加、修改、删除及清空操作实例
Jun 20 MySQL
MySQL高速缓存启动方法及参数详解(query_cache_size)
Jul 01 MySQL
MySql 缓存查询原理与缓存监控和索引监控介绍
Jul 02 MySQL
Mysql分库分表之后主键处理的几种方法
Feb 15 MySQL
MySQL库表太大怎么办? 数据库分库分表项目实践
Apr 11 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
Mysql数据库操作类( 1127版,提供源码下载 )
2010/12/02 PHP
浅谈PHP中其他类型转化为Bool类型
2016/03/28 PHP
php设计模式之观察者模式定义与用法经典示例
2019/09/19 PHP
自己开发Dojo的建议框架
2008/09/24 Javascript
利用JQuery为搜索栏增加tag提示
2009/06/22 Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
2012/08/14 Javascript
利用js动态添加删除table行的示例代码
2013/12/16 Javascript
JavaScript中的style.cssText使用教程
2014/11/06 Javascript
Javascript实现鼠标右键特色菜单
2015/08/04 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
2016/06/13 Javascript
mvc中form表单提交的三种方式(推荐)
2016/08/10 Javascript
JavaScript、C# URL编码、解码总结
2017/01/21 Javascript
ECMAScript6变量的解构赋值实例详解
2017/09/19 Javascript
javascript 产生随机数的几种方法总结
2017/09/26 Javascript
Node.js readline 逐行读取、写入文件内容的示例
2018/03/01 Javascript
JQuery判断radio单选框是否选中并获取值的方法
2019/01/17 jQuery
Vue表单控件绑定图文详解
2019/02/11 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
2019/05/28 Javascript
使用JS实现动态时钟
2020/03/12 Javascript
Python获取Linux系统下的本机IP地址代码分享
2014/11/07 Python
详解Python中with语句的用法
2015/04/15 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
利用Hyperic调用Python实现进程守护
2018/01/02 Python
Python编程argparse入门浅析
2018/02/07 Python
python输出带颜色字体实例方法
2019/09/01 Python
Python 内置变量和函数的查看及说明介绍
2019/12/25 Python
如何基于Python实现数字类型转换
2020/02/07 Python
Python在后台自动解压各种压缩文件的实现方法
2020/11/10 Python
详解基于 Canvas 手撸一个六边形能力图
2019/09/02 HTML / CSS
运动鞋、街头服装、手表和手袋的实时市场:StockX
2020/11/25 全球购物
大学学雷锋活动总结
2014/06/26 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
公证处委托书
2015/01/28 职场文书
西湖英语导游词
2015/02/06 职场文书
Python实现学生管理系统并生成exe可执行文件详解流程
2022/01/22 Python
如何让你的Nginx支持分布式追踪详解
2022/07/07 Servers