with
    ordered_logins as (
        select
            user_id,
            fdate,
            # 通过row_number()、窗口函数,对每个用户的登录日志生成一个连续序列
            # 这里的登陆表tb_dau没有说明同一天是否会有多条登录日志,暂不考虑distinct 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,
            # 如果用户连续每天登陆的话,grp这个日期应该是一样的,反之则会产生一个新的日期(本题关键)
            date_sub(fdate, interval rn day) as grp
        from
            ordered_logins
    )
select
    user_id,
    max(consecutive_days) as max_consec_days  # 一个用户有多个连续登陆天数,取其中最大的
from
    (
        select
            user_id,
            grp,
            count(*) as consecutive_days
        from
            grouped_logins
            # 按user_id和grp日期分组聚合,user_id相同且grp相同的被分在同一组,数该组的行数就能得到一个连续登录天数    
        group by
            user_id,
            grp
    ) as consec
group by
    user_id;