题意:
计算用户在某天刷题后第二天还会再来刷题的平均概率
分解
- 考虑到每天可能都会有同一用户重复答题或答多道题的情况,需要去重,即 distinct(device_id)
- 可考虑将原始表中同时根据device_id、date查询出来的数据,去重后,作为第一天刷题的用户数
因为只有一张表,所以需要构建第二天的数据,可以使用 left join 或者 right join拼接,
拼接后,使用 date_add(date,interval 1 day)=date2 将第一天的日期往后增加一天后再跟第二天的日期进行对比,再用device_id限定是同一个用户 - 次日留存率 = ,在这里就是
代码
select count(date2)/count(date1) avg_ret
from(
select distinct t1.device_id, t1.date date1, t2.date date2
from question_practice_detail as t2 #构建临时表t2,存放第二天的数据
right join ( #右连接查询,查询的是右表的全部数据和符合条件的左表部分数据
select distinct device_id,date
from question_practice_detail) as t1 #右表
on t1.device_id=t2.device_id #查询时限定条件1,用device_id限定为同一用户
and date_add(t1.date,interval 1 day)=t2.date #限定条件2
) as t3
补充: 多表连接查询
- 左连接:left join on
select A.id,A.name,B.jod
from user_info A #查询的是A表(左表)全部数据
left join job B #以及符合条件的B表部分数据
on A.id=B.id #连接条件
- 右连接:right join on
select A.id,A.name,B.jod
from user_info A #查询的是A表(左表)全部数据
right join job B #以及符合条件的B表部分数据
on A.id=B.id #连接条件