# 知道第二天得到的数据后,对其进行计算次日留存率,根据日期分组
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) t1 #每日新增用户表 需要对用户分组,进行去重操作
# 可能会涉及到跨天活跃,所以最好是并集操作,将登录时间和登出时间都拿出来,取并集,进行去重
LEFT JOIN (
SELECT uid,DATE(in_time) dt FROM tb_user_log
UNION
SELECT uid,DATE(out_time) dt FROM tb_user_log ) 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;

1、这道题要的是新用户的留存,所以首先要查出新用户,查新用户的方法,查找最小登录时间

每日新增用户表 需要对用户分组,进行去重操作

2、可能会涉及到跨天活跃,所以最好是并集操作,将登录时间和登出时间都拿出来,取并集,进行去重

3、将每日新增用户表和用户活跃表进行左连接,当统一用户且该用户第二天依旧登录才会保留记录,否则右表会为空

4、知道第二天得到的数据后,对其进行计算次日留存率,根据日期分组