一、窗口函数

select
    dt
    ,round(sum(if(rk=1 and datediff(lead_dt,dt)=1,1,0))/sum(if(rk=1,1,0)),2) uv_left_rate
from (
    select
        dt
        ,row_number()over(partition by uid order by dt) rk
        ,lead(dt,1)over(partition by uid order by dt) lead_dt
    from (
        select
            uid, date(in_time) dt
        from tb_user_log
        union
        select
            uid, date(out_time) dt
        from tb_user_log
    ) t
) t
group by 1
having uv_left_rate is not null and date_format(dt,'%Y-%m')='2021-11'
order by 1

二、连接代替窗口

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