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
MySQL8.0.24版本Release Note的一些改进点
Apr 22 MySQL
52条SQL语句教你性能优化
May 25 MySQL
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
Jul 01 MySQL
MySQL系列之三 基础篇
Jul 02 MySQL
mysql事务对效率的影响分析总结
Oct 24 MySQL
mysql5.6主从搭建以及不同步问题详解
Dec 04 MySQL
MySQL中B树索引和B+树索引的区别详解
Mar 03 MySQL
MySQL派生表联表查询实战过程
Mar 20 MySQL
MySQL学习必备条件查询数据
Mar 25 MySQL
MySQL数据库事务的四大特性
Apr 20 MySQL
Mysql 数据库中的 redo log 和 binlog 写入策略
Apr 26 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
咖啡机如何保养和日常清洁?
2021/03/03 冲泡冲煮
PHP+ACCESS 文章管理程序代码
2010/06/21 PHP
PHP Curl多线程原理实例详解
2013/11/06 PHP
php中实现可以返回多个值的函数实例
2015/03/21 PHP
php生成图片验证码的实例讲解
2015/08/03 PHP
利用PHPExcel实现Excel文件的写入和读取
2017/04/26 PHP
PHP实现微信红包金额拆分试玩的算法示例
2018/04/07 PHP
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
javascript笔记 String类replace函数的一些事
2011/09/22 Javascript
Notify - 基于jquery的消息通知插件
2011/10/18 Javascript
jQuery EasyUI API 中文文档 - PropertyGrid属性表格
2011/11/18 Javascript
jQuery点缩略图弹出层显示大图片
2015/02/13 Javascript
js实现有时间限制消失的图片方法
2015/02/27 Javascript
jquery ui dialog替代confirm实例分析
2016/01/25 Javascript
基于Node.js的JavaScript项目构建工具gulp的使用教程
2016/05/20 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
2018/03/06 Javascript
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
vue封装自定义指令之动态显示title操作(溢出显示,不溢出不显示)
2020/11/12 Javascript
[02:16]卖萌的僵尸 DOTA2神话信使飞僵小宝来袭
2014/03/24 DOTA
Python中元组,列表,字典的区别
2017/05/21 Python
python数据封装json格式数据
2018/03/04 Python
Python实现按逗号分隔列表的方法
2018/10/23 Python
Python基于Tkinter模块实现的弹球小游戏
2018/12/27 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
2019/06/14 Python
django使用django-apscheduler 实现定时任务的例子
2019/07/20 Python
利用pandas将非数值数据转换成数值的方式
2019/12/18 Python
Python3变量与基本数据类型用法实例分析
2020/02/14 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
python MD5加密的示例
2020/10/19 Python
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
2013/06/16 面试题
机电一体化专业求职信
2014/07/22 职场文书
2014教师年度工作总结
2014/11/10 职场文书
2014年科室工作总结
2014/11/20 职场文书
2015年幼儿园中班工作总结
2015/04/25 职场文书