with tt1 as(
    select
    fdate,
    user_id,
    row_number() over (PARTITION BY user_id order by fdate) as rn
		FROM
		tb_dau
		),
tt2 as(
	select
	fdate,
	user_id,
	DATE_SUB(fdate,INTERVAL rn DAY) as grp
	FROM
	tt1)
select 
user_id,
MAX(consec_days) as max_consec_days
from(
select
tt2.user_id,
count(*) as consec_days
from tt2
group by user_id,grp) AS conse
group by user_id

①排序和编号:窗口函数row_number(),对每个用户的登录日期进行排序,并为每个日期分配一个序号

②识别连续序列:DATE_SUB(fdate, INTERVAL rn DAY) AS grp,通过日期与序号的运算,将连续日期映射到同一个分组标识(grp),从而实现对连续序列的精准分组。

③计算连续天数:配合GROUP BY计算最长连续天数