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.计算每天的次日留存率:根据日期分组计算,次日活跃用户个数/当天新用户个数

京公网安备 11010502036488号