题解 | #最长连续登录天数#

最长连续登录天数

https://www.nowcoder.com/practice/cb8bc687046e4d32ad38de62c48ad79b

这道题目要求我们计算2023年1月1日至2023年1月31日期间,每个用户的最长连续登录天数。下面是这个SQL查询的思路和实现步骤。

1. 确定总体问题

我们需要计算每个用户在给定日期范围内的最长连续登录天数。连续登录天数的计算需要识别出连续的日期序列。

2. 分析关键问题

  • 排序和编号:首先,我们需要对每个用户的登录日期进行排序,并为每个日期分配一个序号。
  • 识别连续序列:通过计算每个日期减去其序号的结果,我们可以将连续的日期分组。
  • 计算连续天数:对每个分组计算连续天数,并找出最长的连续天数。

3. 解决每个关键问题的代码及讲解

步骤1:排序和编号

我们使用ROW_NUMBER()窗口函数为每个用户的登录日期分配一个序号:

WITH ordered_logins AS (
    SELECT 
        user_id,
        fdate,
        ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY fdate) AS rn
    FROM 
        tb_dau
    WHERE 
        fdate BETWEEN '2023-01-01' AND '2023-01-31'
)
  • PARTITION BY user_id:按用户分区。
  • ORDER BY fdate:按日期排序。
步骤2:识别连续序列

通过计算每个日期减去其序号的结果,我们可以将连续的日期分组:

grouped_logins AS (
    SELECT 
        user_id,
        fdate,
        rn,
        DATE_SUB(fdate, INTERVAL rn DAY) AS grp
    FROM 
        ordered_logins
)
  • DATE_SUB(fdate, INTERVAL rn DAY):通过把fdate减去rn天,连续的日期将具有相同的结果,从而可以分组。

DATE_SUB处理前后样例如下

fdate(处理前) rn → fdate(处理后)
2023-01-02 1 2023-01-01
2023-01-03 2 2023-01-01
2023-01-05 3 2023-01-02
步骤3:计算连续天数

对每个分组计算连续天数,并找出最长的连续天数:

SELECT 
    user_id,
    MAX(consec_days) AS max_consec_days
FROM (
    SELECT 
        user_id,
        grp,
        COUNT(*) AS consec_days
    FROM 
        grouped_logins
    GROUP BY 
        user_id, grp
) AS consecutive
GROUP BY 
    user_id;
  • COUNT(*) AS consec_days:计算每个分组的数量(具有相同天数的数量),即可得到连续天数。
  • MAX(consec_days) AS max_consec_days:找出每个用户的最长连续天数。

完整代码

WITH ordered_logins AS (
    SELECT 
        user_id,
        fdate,
        ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY fdate) AS rn
    FROM 
        tb_dau
    WHERE 
        fdate BETWEEN '2023-01-01' AND '2023-01-31'
),
grouped_logins AS (
    SELECT 
        user_id,
        fdate,
        rn,
        DATE_SUB(fdate, INTERVAL rn DAY) AS grp
    FROM 
        ordered_logins
)
SELECT 
    user_id,
    MAX(consec_days) AS max_consec_days
FROM (
    SELECT 
        user_id,
        grp,
        COUNT(*) AS consec_days
    FROM 
        grouped_logins
    GROUP BY 
        user_id, grp
) AS consecutive
GROUP BY 
    user_id;
全部评论
不应该是dense_rank()或者distinct+row_number吗?不然同一天,可能有多个编号,下一步减去编号后的结果也有多个,再计数可能个数会算多
6 回复 分享
发布于 2025-06-17 10:25 安徽
最长连续怎么算的
点赞 回复 分享
发布于 2025-11-03 20:19 江苏

相关推荐

01-12 14:08
门头沟学院 Java
有寒假来武汉小米总部实习的大学生嘛,我也是小米的员工,想找合租舍友,仅限女生可免租半月,二月初可入住,也就是说房租是2.15开始算的哦~也可以将行李提前放过来~房屋介绍:1、房子情况:有电梯;租的是三室一厅一卫一厨, 但是有个卧室比较小,不打算找人,只住两个人就可以了;衣柜也很大,可以放下很多衣服;房屋采光真的很好,早上起来可以在床上晒太阳的那种,十分惬意(夏季晚上十分好看!)2. 楼下离我们很近的地方有小吃街和一个两层大超市(大概步行两分钟多就可以走到) ,还有一个新开的麦当劳,晚上可以去吃小吃,购买物资也可以去大超市;3. 房子基本设施齐备(洗衣机,冰箱,空调,油烟机,热水器);4. 我有稳定的工作,生活中很注意卫生,周末有时间会自己做饭,可以投喂哦~5. 出行:距离公交站步行10分钟不到,距政务中心,武汉小米总部三站(晚上我都是走回来的,很近的~);一个比较进的地铁,距离大概1km左右;出入我觉得很方便;6. 房租:1150每月,押一付二,无物业费,也没有中介费和其他额外费用。7. 民用水电燃气,用多少交多少,水电费正常平摊。希望你是:1. 女生(本人女),不带异性回家,如有同性朋友来玩,最多过夜一晚;2. 爱干净,讲卫生,作息正常,不吵闹,有稳定工作;3. 好沟通,有任何问题一定要沟通,不要闷着!中介勿扰,非诚勿扰!!!希望不要浪费彼此的时间诚心有意向的可以联系我看房
租房找室友
点赞 评论 收藏
分享
01-26 19:51
门头沟学院 Java
点赞 评论 收藏
分享
评论
55
12
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务