mysql 用户 多次 登录_用户连续操作(登录)数量(次数)最大的记录(用户)...

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-28 19:45   47   0

用户连续操作(登录)数量(次数)最大的记录(用户)

背景

根据用户连续记录天数来计算的,求出用户在一段时间内最大的连续记录时间,例如在 2016-01-01 和 2016-01-28 之间,如果用户在3号和4号都记录了,那么连续记录天数为2,如果用户在6号-10号每日都记录了,那么最大连续记录天数为5,简而言之:求连续日期登录次数最大的用户;

突破口

借助rownumber即可求解;

如果是连续的记录,那么 diffDate- rn 肯定是相同的!

核心的代码:logindate - row_number() over (partition by userid order by logindate) as groupday

实际上,上面这个查询,遇到一天登录多次的情况下,统计是不准确的,所以这时应该先去除某天的重复数据,才是正确的

衍生

不仅可以解决一段时间内的最大连续登陆天数,还能计算连续登陆3天,7天的用户

For example:

userID|logindate

10002014-01-10

10002014-01-11

10002014-02-01

10002014-02-02

10012014-02-01

10012014-02-02

10012014-02-03

10012014-02-04

10012014-02-05

10022014-02-01

10022014-02-03

10022014-02-05

.....

借助窗口函数row_number;

selectuserid,max(days)

from

(

selectuserid,groupday,count(*)asdays

from

(

select

userid,logindate-row_number()over(partitionbyuserid orderbylogindate)asgroupday

frommytable

)

groupbyuserid,groupday

)

groupbyuserid

--having max(days)>=2

mysql 的查询query

select

userid,max(days)

from

(

select

userid,date_add(logindate,interval-row_number day)asgroupday,count(*)asdays

from

(

select

userid,logindate,

@row_num:=@row_num+1asrow_number

frommytable

cross join(select@row_num:=0)r

orderbyuserid,logindate

)

groupbyuserid,groupday

)

groupbyuserid

--having max(days)>=2

结果

9fd21217c7343d59fcda391d46bb452d.png

结果符合我们的预期,算是完整的答案了。

参考

求连续操作(登录)数量(次数)最大的记录(用户) - 云+社区 - 腾讯云

mysql - How to wirte an extensible SQL to find the users who continuously login for n days - Stack Overflow

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP