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计算最长连续天数

京公网安备 11010502036488号