题解 | #最长连续登录天数#
最长连续登录天数
https://www.nowcoder.com/practice/cb8bc687046e4d32ad38de62c48ad79b
with rk_tb AS ( SELECT user_id, fdate, DENSE_RANK() OVER ( PARTITION BY user_id ORDER BY fdate ) rk FROM tb_dau ), diff_tb AS ( SELECT user_id, fdate, rk, DATE_SUB(fdate, INTERVAL rk day) diff FROM rk_tb ), consecutive_day_tb AS ( SELECT user_id, DENSE_RANK() OVER ( PARTITION BY user_id, diff ORDER BY fdate ) day FROM diff_tb ) SELECT DISTINCT user_id, MAX(day) max_consec_days FROM consecutive_day_tb GROUP BY user_id
强烈建议写一下SQL167,看下评论区大佬给的解题思路
- 创建日期排名:对每个用户的登录日期进行排名。这可以通过 DENSE_RANK() 函数实现。这样,你可以为每个用户的登录记录分配一个连续的排名值。
- 计算日期与排名的差异:通过计算每个登录日期和其对应排名之间的差异来帮助识别连续登录的天数。具体来说,可以通过 DATE_SUB 函数将日期减去排名值,从而得到一个相对的差异值。
- 识别连续的登录天数:基于上一步计算得到的差异值,将登录记录按用户和差异值进行分组。对每个分组内的登录日期进行排序,并为每个分组内的登录日期分配一个新的排名,这样可以识别连续的登录天数。
- 计算最长的连续登录天数:对每个用户的连续登录天数进行汇总,找出每个用户的最大连续登录天数。这可以通过计算每个用户的最大连续天数值来实现。
具体步骤总结:
- 为用户的每次登录计算排名:标记每个用户的登录日期的排名。
- 计算日期和排名之间的差值:确定日期差异,以识别连续的登录记录。
- 按差异值分组并计算连续登录天数:对每个用户按日期差异进行分组,并计算每个分组内的连续天数。
- 找到最长连续登录天数:从每个用户的连续登录天数中找出最大值。
通过以上步骤,你可以得到每个用户在指定日期范围内的最长连续登录天数。