题解 | 最长连续登录天数

最长连续登录天数

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

WITH t1 AS(
    SELECT user_id, fdate, ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY fdate) AS rn
    FROM tb_dau
),
t2 AS(
    SELECT user_id, fdate, DATE_SUB(fdate, INTERVAL rn DAY) AS grp
    FROM t1
),
t3 AS(
    SELECT
        user_id, grp, COUNT(*) AS log_days
    FROM t2
    GROUP BY user_id, grp
)
SELECT
    user_id,
    MAX(log_days) AS max_consec_days
FROM t3
GROUP BY user_id;

思路:

  • 生成连续登录的分组标识:
  • 使用 ROW_NUMBER() 窗口函数为每个用户的登录记录按日期排序。
  • 将每个登录日期减去行号(fdate – rn = 本次连续登录的第一个登录日),如果登录是连续的,这个登录日将保持不变。
  • 将这个差值作为分组标识(grp)。
  • 分组统计连续登录天数:
  • 按用户 ID 和分组标识(grp)分组,统计每个分组的登录天数。
  • 使用 COUNT() 函数计算每个分组的天数,即每个连续登录区间的天数。
  • 计算最长连续登录天数:
  • 对每个用户,取其所有连续登录区间的最大值。

语法:

  • WITH t1 AS 的作用是定义一个名为 t1 的临时表,用于存储中间结果。它允许你将一个查询的结果定义为一个临时的表,然后在主查询中引用它。

  • DATE_SUB() 是一个日期函数,用于从指定的日期中减去指定的时间间隔。它与 DATE_ADD() 函数相对,用于执行日期的减法操作。

全部评论

相关推荐

昨天 12:43
已编辑
小码王_运维
蚂蚁岗位内推官:1 你觉得你有哪些缺点和优点? 2 你怎么评价你面试的这家公司? 3 你在校期间,有没有哪段时间或者某件事情让你受挫? 4 在校期间遇到最有挑战的事情是什么? 5 目前手上有 offer 吗? 6 自我介绍 7 职业规划 8 报学校专业是怎么考虑的? 9 工作城市 10 你是独生子女吗? 11 那你男朋友吗? 12 那你们出来面试都了解过哪些企业? 13 到后期你们每个人手上有好几个offer,哪些因素决定你们选择这家公司? 14 你更倾向哪种公司?有什么特别的点? 15 你大学有没有特别难忘的经历或者项目分享一下的? 16 团队合作中遇到什么问题? 17 对互联网加班有什么看法? 18 那你现在的技术薄弱点在哪里,怎么去突破? 19 你的兴趣爱好有哪些? 20 现在进度最快的公司是哪家? 21 拿到哪几家offer,是否谈过薪资等
点赞 评论 收藏
分享
01-16 18:34
四川大学 Java
欢迎加入AI:没有啥稳定不稳定,一切都源于业务快速发展还是收缩。我当年一开始去的央企,业务不赚钱,也贼卷,慢慢就开始优化了。。。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务