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 02 MySQL
MySQL时间设置注意事项的深入总结
May 06 MySQL
如何用Navicat操作MySQL
May 12 MySQL
MySQL 自定义变量的概念及特点
May 13 MySQL
MySQL 8.0 之不可见列的基本操作
May 20 MySQL
MySQL中出现乱码问题的终极解决宝典
May 26 MySQL
MySQL 数据恢复的多种方法汇总
Jun 21 MySQL
MySQL 四种连接和多表查询详解
Jul 16 MySQL
MySQL里面的子查询的基本使用
Aug 02 MySQL
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
Apr 20 MySQL
mysql字段为NULL索引是否会失效实例详解
May 30 MySQL
MySQL性能指标TPS+QPS+IOPS压测
Aug 05 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和ACCESS写聊天室(三)
2006/10/09 PHP
海河写的 Discuz论坛帖子调用js的php代码
2007/08/23 PHP
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
2008/11/14 PHP
PHP 飞信好友免费短信API接口开源版
2010/07/22 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
NodeJS的url截取模块url-extract的使用实例
2013/11/18 NodeJs
jQuery select表单提交省市区城市三级联动核心代码
2014/06/09 Javascript
页面刷新时记住滚动条的位置jquery代码
2014/06/17 Javascript
原生javascript实现隔行换色
2015/01/04 Javascript
jQuery实现图片走马灯效果的原理分析
2016/01/16 Javascript
ES6概念 Symbol toString()方法
2016/12/25 Javascript
Bootstrap导航条学习使用(二)
2017/02/08 Javascript
使用vue.js写一个tab选项卡效果
2017/03/25 Javascript
Node实战之不同环境下配置文件使用教程
2018/01/02 Javascript
jQuery中复合选择器简单用法示例
2018/03/31 jQuery
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
python快速排序代码实例
2013/11/21 Python
python用Pygal如何生成漂亮的SVG图像详解
2017/02/10 Python
python3.4控制用户输入与输出的方法
2018/10/17 Python
Python3自动签到 定时任务 判断节假日的实例
2018/11/13 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
python3实现表白神器
2019/04/09 Python
如何更优雅地写python代码
2019/07/02 Python
Django rest framework jwt的使用方法详解
2019/08/08 Python
django 通过url实现简单的权限控制的例子
2019/08/16 Python
如何学习Python time模块
2020/06/03 Python
Python创建临时文件和文件夹
2020/08/05 Python
上班离岗检讨书
2014/01/27 职场文书
蓝颜请假条
2014/04/11 职场文书
水利水电建筑施工应届生求职信
2014/07/04 职场文书
python tkinter模块的简单使用
2021/04/07 Python
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
如何解决goland,idea全局搜索快捷键失效问题
2022/04/03 Golang
浅析Python OpenCV三种滤镜效果
2022/04/11 Python