题解 | 最长连续登录天数
最长连续登录天数
https://www.nowcoder.com/practice/cb8bc687046e4d32ad38de62c48ad79b
with t1 as ( select fdate, user_id, row_number() over ( partition by user_id order by fdate ) rk from tb_dau ), t2 as ( select user_id, fdate, date_sub(fdate, interval rk day) as grp from t1 ) select user_id, max(log_days) max_consec_days from ( select user_id, count(grp) log_days from t2 group by user_id, grp ) temp group by user_id
t1表利用窗口函数row_number给每个用户(partition by 分区)的登录记录按日期排序分配唯一且连续的行号;
t2表计算每个用户登录日期与对应行号差值的日期,如果用户的登录是连续的,那么同一组连续登录日期计算得到的 grp
值是相同的;
t2
中选取数据,按照 user_id
和 grp
进行分组。COUNT(grp)
:统计每个分组内的记录数量,即每个连续登录组的天数,存储在 log_days
列中temp
中选取数据,按照 user_id
进行分组。MAX(log_days)
:计算每个用户的最大连续登录天数,存储在 max_consec_days
列中