select user_id,
       max(days) as max_consec_days
from(
select user_id,
        datediff(max(fdate),min(fdate))+1 as days
from
(
select 
    user_id,
    fdate,
    row_number() over(partition by user_id order by fdate) as num,
    date_sub(fdate,interval row_number() over(partition by user_id order by fdate) day) as cnt
from tb_dau
where fdate between '2023-01-01' and '2023-01-31') a
group by user_id,cnt) b
group by user_id;

思路:按照连续登陆进行分组,然后统计每组中连续登陆的天数,最后在外层取最大值。

连续如何判定,使用窗口函数,对用户进行分组,按照时间排序,并给出序号,如果是连续登陆,那么该日期与序号的差值应该是相同的,可以以二者差值作为分组依据。

连续登陆天数如何计算,在同一分组中,最大日期和最小日期的差加1即为连续登陆天数,可以用datediff函数求出。

取最大的连续登陆天数,使用max函数求出最大连续登陆天数即可。