select user_id, max(num) as max_consec_days
from (
    select user_id, ori_date, count(distinct fdate) as num
    from (
        select user_id, fdate, date_sub(fdate, interval rn day) as ori_date
        from (
            select user_id, fdate, dense_rank() over(partition by user_id order by fdate) as rn
            from tb_dau
            where fdate between '2023-01-01' and '2023-01-31'
        ) a
    ) b
    group by user_id, ori_date
) c
group by user_id

最大连续登陆天数题解,主要用的比较热门的想法,对每个用户的登陆日期进行顺序排序,计算登陆日期与排序结果的差值,得到初始日期,每个用户会有多个初始日期,对每个客户、每个初始日期下的登陆日期去重计数,得到该用户该初始日期下的连续登陆天数,取该用户的最大连续登陆天数即可。

有一个点是这里用dense_rank()更合适,因为实际业务中不一定是去重后的表格,dense_rank()能让重复的日期得到相同的排名,且下一个日期的排名仅增加1