1、理解题意:
①什么是用户“活跃”?根据题目要求“如果in_time-进入时间和out_time-离开时间跨天了,在两天里都记为该用户活跃过”可知,当用户存在《注册/登录/离开》的《当天》才算用户“活跃”。
②什么算“新用户”?根据题目要求,“当且仅当”活跃“2天”算新用户
③怎么计算“次留存率”?次留存率=第2天持续活跃人数/第1天注册人数
【注意1:第2天“持续”活跃人数,是针对第1天注册过的用户来说的】
【注意2:可从题目给出的案例中(11.04没有新用户,不输出。),可知“持续活跃”2天内才属于“新用户”,才能符合条件(次日+符合新用户条件=只计算连续2天的人数),就算用户活跃了3天,那对于第3天来说他就属于《老用户》,其就不属于“活跃人数”】
【注意3:统计时间范围“2021年11月每天”】

2、解题:
①创建1张用户注册表(初次登录表)
with user_reg
as(
    select uid,
    date(min(in_time)) as first_date
    from tb_user_log
    group by 1
), -- 用户注册表
②创建1张用户活跃表(在初次登录之后,以后每次的登录/离开日期————注意:此处用union排除1个用户1天内既登入又离开的情况)
user_reac 
as(
    select uid,
    date(in_time) as dt
    from tb_user_log

    union

    select uid,
    date(out_time) as dt
    from tb_user_log
) -- 用户活跃表(登录/离开=活跃)

③将2张表进行左连接(保留初次登录表,用户活跃表的uid与其进行关联,其次用户活跃表的“日期-1天”后《!!!这样就能将1个用户首次登录日期&第2天登录日期拼接到同1行中》,要与初次登陆表中的日期挂钩),然后以“用户注册表”的日期为分组统计基础,计算每天的“次留存率”
select user_reg.first_date,
round(count(user_reac.dt)/count(user_reg.first_date),2)
from user_reg 
left join user_reac
on user_reg.uid = user_reac.uid
and user_reg.first_date = date_sub(user_reac.dt,interval 1 day)
where user_reg.first_date like '2021-11%'
group by 1