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;