您正在使用IPV4(18.205.176.39)访问本站 您本次共访问本站 1 次
 用户名: 密 码: 验证码:     用QQ登录本站
首页 软件 编程 笑话 知识 公告 台风 日历 计算器
[公益]文明驾车我带头,文明行路我带头,礼貌让座我带头       深圳小产权房      

【腾讯云】热门云产品首单特惠秒杀,2核2G云服务器45元/年      
[公益] 节省一分零钱 献出一份爱心 温暖世间真情      
2022年 儿童节 15
2022年 端午节 17
2023年 元 旦 229
2023年 春 节 250
 
本类新增
本类热门文章
您现在的位置:首页 >> 数据库 >> 内容
MySQL如何计算连续登录天数
内容摘要: 建表、insert数据createtabletmp_login(user_idint(11),login_datedatetime);insertintotmp_loginvalues(2,'2020-05-2911:12:12');insertintotmp_loginvalues(2,'2020-05-2915:12:12');insertintotmp......
建表、insert数据

createtabletmp_login(user_idint(11),login_datedatetime);insertintotmp_loginvalues(2,'2020-05-2911:12:12');insertintotmp_loginvalues(2,'2020-05-2915:12:12');insertintotmp_loginvalues(2,'2020-05-3011:12:12');insertintotmp_loginvalues(2,'2020-05-3111:12:12');insertintotmp_loginvalues(2,'2020-06-0111:12:12');insertintotmp_loginvalues(2,'2020-06-0211:12:12');insertintotmp_loginvalues(2,'2020-06-0311:12:12');insertintotmp_loginvalues(2,'2020-06-0411:12:12');insertintotmp_loginvalues(2,'2020-06-0511:12:12');insertintotmp_loginvalues(2,'2020-06-0611:12:12');insertintotmp_loginvalues(2,'2020-06-0711:12:12');insertintotmp_loginvalues(7,'2020-06-0111:12:12');insertintotmp_loginvalues(7,'2020-06-0211:12:12');insertintotmp_loginvalues(7,'2020-06-0311:12:12');insertintotmp_loginvalues(7,'2020-06-0511:12:12');insertintotmp_loginvalues(7,'2020-06-0611:12:12');insertintotmp_loginvalues(7,'2020-06-0711:12:12');insertintotmp_loginvalues(7,'2020-06-0811:12:12');

方法一row_number()

1.查询所有用户的每日登录记录

selectdistinctuser_id,date(login_date)asdaysfromtmp_login;

在这里插入图片描述

2.row_number()计算登录时间排序

selectuser_id,days,row_number()over(partitionbyuser_idorderbydays)asrnfrom(selectdistinctuser_id,date(login_date)asdaysfromtmp_login)t1;

在这里插入图片描述

3.用登录时间-row_number(),如果得到的日期相同,则认为是连续登录日期

select*,date_sub(days,intervalrnday)asresultsfrom(selectuser_id,days,row_number()over(partitionbyuser_idorderbydays)asrnfrom(selectdistinctuser_id,date(login_date)asdaysfromtmp_login)t1)t2;

在这里插入图片描述

4.按user_id、results分组就可得出连续登录天数

selectuser_id,count(*)asnum_daysfrom(select*,date_sub(days,intervalrnday)asresultsfrom(selectuser_id,days,row_number()over(partitionbyuser_idorderbydays)asrnfrom(selectdistinctuser_id,date(login_date)asdaysfromtmp_login)t1)t2)t3groupbyuser_id,results;

在这里插入图片描述

直接用日期减去row_number(),不用date_sub的话,遇到登录日期跨月时会计算错误,

方法二lead()或lag()

这种情况适合的场景是,需要查找连续登录超过n天的用户,n为确定值

如果n为4,即计算连续登录超过4天的用户

--lead计算连续登录selectdistinctuser_idfrom(selectuser_id,days,datediff(lead(days,3,'1970-01-01')over(partitionbyuser_idorderbydays),days)asresultsfrom(selectdistinctuser_id,date(login_date)asdaysfromtmp_login)t1)t2whereresults=3;

连续登录4天,则日期差应该为3。

上一篇:MySQL防止delete命令删除数据的 下一篇:MySQL定时备份数据库操作示例
发布日期:2022/5/9
手机扫二维码直达本页
发布时间:14:17:35
点击:141
录入:齐天大圣
相关文章
Baidu

YiJiaCMS 6.2.1.220509(MSSQL) 闽ICP备05000814号-1
本空间由腾讯云(轻量应用服务器)提供,百度云加速提供加速防护
Copyright©2000-2022