用户连续登陆最大天数算法优化

用户连续登陆最大天数算法优化

  • 业务场景
  • 场景模拟
  • 算法解答

业务场景

  在社交类网站平台业务需求中,需要计算用户的最大连续登陆天数。常用的计算是通过新建一张日期比用户登录日期少一天的关联表,再根据两张表日期是否相等来进行比较判断,再经过多次运算得出结果。现在介绍一种比较优化的方法,可以节省数据库计算耗费的资源。

场景模拟

  这里做一个小的场景模拟求用户的最大连续登陆天数。一般在业务系统后台数据库中,有两个字段是已知的,即用户id与用户登录时间。如果数据库表没有明确给出已知字段与原始数据,也可以通过数据提取在数据库创建相关表,如图所示:
用户连续登陆最大天数算法优化_第1张图片

算法解答

(1)首先按用户登录时间升序排序
  执行语句:

select user_id,login_data,row_number() over(
partition by user_id order by login_data
) as sort from user_log

  运行结果:

user_id     login_data     sort
yh001	    2019-11-25	    1
yh001   	2019-11-26	    2
yh001   	2019-11-27	    3
yh001	    2019-12-01	    4
yh001	    2019-12-02	    5
yh001   	2019-12-26	    6
yh001   	2019-12-27	    7

(2)将排序的序号与用户登录日期做日期差值
  执行语句:

select user_id,date_sub(log_date,sort) dsub from (select 
user_id,log_date,row_number() over(partitioned by user_id 
order by log_date) as sort from user_log) a

  运行结果:

user_id     dsub
yh001	    2019-11-24
yh001   	2019-11-24
yh001   	2019-11-24
yh001	    2019-11-27
yh001	    2019-11-27
yh001   	2019-12-20
yh001   	2019-12-20

(3)计算登录时间相同的数量,即分组求和
  执行语句:

select user_id,count(1)	as num from
  (select user_id,date_sub(log_date,sort) dsub from
    (select user_id,log_date,row_number() over(partitioned by 
      user_id order by log_date) as sort from user_log) a)	b 
       group by dsub

  运行结果:

user_id     num 
yh001	    3
yh001   	2
yh001   	2

(4)计算用户的最大连续登陆天数

  执行语句:

select user_id,max(num) maxnum from 
(select user_id,count(1) as num from
  (select user_id,date_sub(log_date,sort) dsub from
    (select user_id,log_date,row_number() over(partitioned by 
      user_id order by log_date) as sort from user_log) a) b
       group by dsub) c

  运行结果:

user_id     maxnum 
yh001	    3

你可能感兴趣的:(数据仓库与数据挖掘)