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 pt-slave-restart工具的使用简介
Apr 07 MySQL
浅谈Mysql多表连接查询的执行细节
Apr 24 MySQL
MySQL完整性约束的定义与实例教程
May 30 MySQL
MySQL系列之一 MariaDB-server安装
Jul 02 MySQL
MySQL 四种连接和多表查询详解
Jul 16 MySQL
MySQL数据库10秒内插入百万条数据的实现
Nov 01 MySQL
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
Jan 22 MySQL
一条 SQL 语句执行过程
Mar 17 MySQL
排查MySQL生产环境索引没有效果
Apr 11 MySQL
MySQL数据库中的锁、解锁以及删除事务
May 06 MySQL
深入理解MySQL中MVCC与BufferPool缓存机制
May 25 MySQL
MySQL详细讲解变量variables的用法
Jun 21 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文件中bom的PHP代码
2012/03/13 PHP
php生成二维码时出现中文乱码的解决方法
2014/12/18 PHP
简单谈谈php浮点数精确运算
2016/03/10 PHP
总结对比php中的多种序列化
2016/08/28 PHP
PHP与Perl之间知识点区别整理
2019/03/19 PHP
Js+Jq获取URL参数的集中方法示例代码
2014/05/20 Javascript
Nodejs极简入门教程(一):模块机制
2014/10/25 NodeJs
JS是按值传递还是按引用传递
2015/01/30 Javascript
基于gulp合并压缩Seajs模块的方式说明
2016/06/14 Javascript
使用jQuery调用XML实现无刷新即时聊天
2016/08/07 Javascript
浅谈JavaScript 中有关时间对象的方法
2016/08/15 Javascript
jQuery实现删除li节点的方法
2016/12/06 Javascript
全面解析Node.js 8 重要功能和修复
2017/06/02 Javascript
jQuery 控制文本框自动缩小字体填充
2017/06/16 jQuery
解决vue-cli中stylus无法使用的问题方法
2017/06/19 Javascript
JS基于开关思想实现的数组去重功能【案例】
2019/02/18 Javascript
详解webpack 最简打包结果分析
2019/02/20 Javascript
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
2019/04/30 Javascript
bootstrap table插件动态加载表头
2019/07/19 Javascript
Vue基于localStorage存储信息代码实例
2020/11/16 Javascript
Python导出DBF文件到Excel的方法
2015/07/25 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
python实现log日志的示例代码
2018/04/28 Python
深入解析神经网络从原理到实现
2019/07/26 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
python打开文件的方式有哪些
2020/06/29 Python
用纯css3和html制作泡沫对话框实现代码
2013/03/21 HTML / CSS
英国著名的小众美容品牌网站:Alyaka
2017/08/08 全球购物
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2013/05/03 面试题
中专生自荐信
2013/10/12 职场文书
科室工作的个人自我评价
2013/10/30 职场文书
小学生法制教育心得体会
2016/01/14 职场文书
Pytorch使用shuffle打乱数据的操作
2021/05/20 Python
Django操作cookie的实现
2021/05/26 Python
如何搭建 MySQL 高可用高性能集群
2021/06/21 MySQL
python实现学生信息管理系统(面向对象)
2022/06/05 Python