间断连续登陆天数问题

间断连续登陆天数问题

问题:
统计用户最大连续登陆天数, 间隔一天也算是连续登陆;例如: 用户 1 3 5 8 登陆, 算做连续登陆5天

1- 数据准备
-- 数据准备
WITH user_active_info AS (
SELECT * FROM (
    VALUES ('10001' , '2023-02-01'),('10001' , '2023-02-03')
          ,('10001' , '2023-02-08'),('10001' , '2023-02-05')
          ,('10002' , '2023-02-02'),('10002' , '2023-02-10')
          ,('10002' , '2023-02-04'),('10002' , '2023-02-05')
          ,('10002' , '2023-02-07'),('10003' , '2023-02-02')
          ,('10003' , '2023-02-03'),('10003' , '2023-02-04')
          ,('10003' , '2023-02-04'),('10003' , '2023-02-06')
          ,('10003' , '2023-02-09'),('10003' , '2023-02-08')
          ,('10004' , '2023-02-03'),('10004' , '2023-02-04')
          ,('10004' , '2023-02-06'),('10004' , '2023-02-09')
          ,('10004' , '2023-02-08'),('10004' , '2023-02-08') 
    	  ,('10005' , '2023-02-02'),('10005' , '2023-02-05') 
    	  ,('10005' , '2023-02-06'),('10005' , '2023-02-09')  
) AS user_active_info(user_id, active_date) 
)
2- 代码实现
-- 1. 获取上次登录时间
, t_1 AS (
SELECT 
      user_id, active_date
    , LAG(active_date, 1, '1970-01-01') OVER(PARTITION BY user_id ORDER BY active_date) AS lag1_date 
FROM ( -- 按照用户和日期去重, 每天只保留一条登陆记录
    SELECT user_id , active_date 
    FROM user_active_info 
    GROUP BY user_id , active_date 
) a
)
user_idactive_datelag1_date
100012023-02-011970-01-01
100012023-02-032023-02-01
100012023-02-052023-02-03
100012023-02-082023-02-05
100022023-02-021970-01-01
100022023-02-042023-02-02
100022023-02-052023-02-04
100022023-02-072023-02-05
100022023-02-102023-02-07
100032023-02-021970-01-01
100032023-02-032023-02-02
100032023-02-042023-02-03
-- 2. 打标签: 连续登陆的标为相同标签
, t_2 AS (
SELECT 
      user_id, active_date, lag1_date, flag
    , CONCAT(user_id, '_' ,flag) AS user_id_flag -- 合成新的标签: 标签相同为连续登陆
FROM (
    SELECT -- 打标签, 两次日期相差大于2, 开始分段打标签
          user_id, active_date, lag1_date
        , SUM(IF(DATEDIFF(active_date, lag1_date) > 2 , 1 , 0)) OVER(PARTITION BY user_id ORDER BY active_date)  AS flag
    FROM t_1
) a
)
user_idactive_datelag1_dateflaguser_id_flag
100012023-02-011970-01-01110001_1
100012023-02-032023-02-01110001_1
100012023-02-052023-02-03110001_1
100012023-02-082023-02-05210001_2
100022023-02-021970-01-01110002_1
100022023-02-042023-02-02110002_1
100022023-02-052023-02-04110002_1
100022023-02-072023-02-05110002_1
100022023-02-102023-02-07210002_2
100032023-02-021970-01-01110003_1
100032023-02-032023-02-02110003_1
-- 3. 计算每个用户每组连续天数 -> 获取每个用户的最大连续天数
SELECT -- 获取每个用户的最大连续天数
    user_id, MAX(continue_days) AS max_continue_days
FROM (
    SELECT -- 计算每个用户每组连续天数
          user_id , user_id_flag
        , DATEDIFF(MAX(active_date),MIN(active_date)) + 1 AS continue_days
    FROM t_2
    GROUP BY user_id , user_id_flag
) a
GROUP BY user_id 
;
user_iduser_id_flagcontinue_days
1000110001_15
1000110001_21
1000210002_16
1000210002_21
1000310003_18
1000410004_17
1000510005_11
1000510005_22
1000510005_31
user_idmax_continue_days
100015
100026
100038
100047
100052
3- 总结
  1. 连续登陆天数的升级版
  2. 结合浏览窗口划分
end
  • 18
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值