select t1.first_day, round(count(t2.uid)/count(t1.uid),2) as uv_left_rate
from (select uid, min(date(in_time)) as first_day
from tb_user_log
group by uid) t1  -- 新用户
left join
(select uid, date(in_time) as in_out from tb_user_log
union 
select uid, date(out_time) as in_out from tb_user_log
) t2  -- 活跃表
on t1.uid = t2.uid and t1.first_day = date_sub(t2.in_out, INTERVAL 1 day)
where date_format(t1.first_day,'%Y-%m') = '2021-11'
group by t1.first_day 
order by t1.first_day;

1:先找出新用户,利用日期最小值,找出每一天出现的新用户表
2:找出活跃用户,题目中说如果in_time-进入时间out_time-离开时间跨天了,在两天里都记为该用户活跃过,则利用union将每个用户的进入时间和离开时间放在一起,则组合成一个用户活跃表
3.将新用户表和用户活跃表用left join 连接,接条件则是相同uid和该用户第2天依旧登陆才会保留整个记录,否则右表记录为空
4.计算每天的次日留存率:根据日期分组计算,次日活跃用户个数/当天新用户个数