题意:


计算用户在某天刷题后第二天还会再来刷题的平均概率

分解


  • 考虑到每天可能都会有同一用户重复答题或答多道题的情况,需要去重,即 distinct(device_id)
  • 可考虑将原始表中同时根据device_id、date查询出来的数据,去重后,作为第一天刷题的用户数
    因为只有一张表,所以需要构建第二天的数据,可以使用 left join 或者 right join拼接,
    拼接后,使用 date_add(date,interval 1 day)=date2 将第一天的日期往后增加一天后再跟第二天的日期进行对比,再用device_id限定是同一个用户
  • 次日留存率 = \frac{第一天刷题后,第二天依然刷题的用户数}{第一天刷题的用户数},在这里就是count(date2)count(date1)\frac{count(date2)}{count(date1)}

代码


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      #连接条件