创建2个表 一个表是所有用户的登录情况表active_user_t t1(date,uid)

    select uid,in_time
    from tb_user_log
    where date_format(in_time,'%Y-%m')='2021-11'
    union
    select uid,out_time
    from tb_user_log
    where date_format(in_time,'%Y-%m')='2021-11'

一个表是新用户首次登陆情况表 new_user_t t2(date,uid)用min

    SELECT *
    from tb_user_log
    where (uid,in_time) in (
      select uid,min(in_time)
      from tb_user_log
      group by uid

将将t1 left join t2 然后group by t2的date(新用户首次登陆时间) 计算次日留存人数(用case when & count)和当日新用户人数(count)

select date(b.in_time) dt
,round(count(distinct case when datediff(a.in_time,b.in_time)=1 then b.uid end)/count(distinct b.uid),2) 次日留存率
from active_user_t a
inner join new_user_t b
on a.uid=b.uid
group by date(b.in_time)
order by dt