计算新用户留存率思路:

1.查找每日的新用户:所有用户登录日志中in_time最小值为当天新用户;

2.查找新用户次日活跃:新用户次日登录,或in_time-进入时间和out_time-离开时间跨天了,在两天里都记为该用户活跃过;

3.新用户表左连接活跃用户表,无新用户当日不展示;

函数注记:

1.union和union all的区别:union all只是合并查询结果,并不会进行去重和排序操作,在没有去重的前提下,使用union all的执行效率要比union高

2.date_sub的用法:date_sub(date,interval expr type),函数从日期减去指定的时间间隔,type类型有DAY、HOUR、MINUTE、SECOND、WEEK、MONTH等

select t1.dt,round(count(t2.uid)/count(t1.uid),2) uv_left_rate
from
(select uid,min(date(in_time)) dt
from tb_user_log
group by uid) t1 #新用户表
left join
(select uid,date(in_time) dt
from tb_user_log
#union all只是合并查询结果,并不会进行去重和排序操作,在没有去重的前提下,使用union all的执行效率要比union高
union 
select uid,date(out_time) dt
from tb_user_log)t2 #活跃用户表
#date_sub(date,interval expr type),函数从日期减去指定的时间间隔
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 
;