连续登录问题(详细解答)

连续登录问题(详细解答)

一、题目

1、连续登录问题

间隔两天也算连续登录,最终结果要用户的开始时间、结束时间和最大连续登录天数

2、数据
with
    xie as(
        select '1' as user_id,'2023-02-01' as login_date
        union all
        select '1' as user_id,'2023-02-03' as login_date
        union all
        select '1' as user_id,'2023-02-05' as login_date
        union all
        select '1' as user_id,'2023-02-08' as login_date
        union all
        select '1' as user_id,'2023-02-10' as login_date
        union all
        select '2' as user_id,'2023-02-02' as login_date
        union all
        select '2' as user_id,'2023-02-04' as login_date
        union all
        select '2' as user_id,'2023-02-06' as login_date
	)
3、结果预览

在这里插入图片描述

二、思路

1、第一步:按user_id进行分组,把符合连续登录规则的算成同一组,并打上标记,思路图如下:

在这里插入图片描述

2、第二步:按user_id和标记进行分组,取出连续登录的用户的连续登录开始时间和结束时间,再拿结束时间减开始时间得到连续登录的天数,思路图如下:

在这里插入图片描述

3、第三步:用rank()开窗,按user_id进行分组,按连续登录的天数排序,最后取排名等于1的,就是最大连续登录天数,思路图如下:

在这里插入图片描述

三、答案

sql
with
    xie as(
        select '1' as user_id,'2023-02-01' as login_date
        union all
        select '1' as user_id,'2023-02-03' as login_date
        union all
        select '1' as user_id,'2023-02-05' as login_date
        union all
        select '1' as user_id,'2023-02-08' as login_date
        union all
        select '1' as user_id,'2023-02-10' as login_date
        union all
        select '2' as user_id,'2023-02-02' as login_date
        union all
        select '2' as user_id,'2023-02-04' as login_date
        union all
        select '2' as user_id,'2023-02-06' as login_date
	)
select user_id
        ,min_login_date
        ,max_login_date
        ,days 
from(
    select user_id
            ,min_login_date
            ,max_login_date
            ,days
            ,rank() over (partition by user_id order by days desc) as rn
    from(
        select user_id
                ,min(login_date) as min_login_date
                ,max(login_date) as max_login_date
                ,datediff(max(login_date),min(login_date))+1 as days
        from(
            select user_id
                    ,login_date
                    ,sum(aa) over (partition by user_id order by login_date) as bb
            from (
                select user_id
                        ,login_date
                        ,if(datediff(login_date,lag(login_date,1,'0000-00-00') over (partition by user_id order by login_date))>2,1,0) as aa
                from xie
            )t1
        )tt1
        group by user_id,bb
    )ttt1
)tttt1
where rn = 1
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没钳蟹蟹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值