次日留存率,就是将原始表按device_id,data进行去重(表a)后的人数除你筛选出的合格人数。

在这里我首先用了join就是自连接,条件查询然后datediff求差来筛选二次留存用户,但是被除数没办法搞定,因为这是取交集,没办法就那里又套了一个select查询语句


select count(a.device_id)/ (select count(distinct device_id, date)
    from question_practice_detail) avg_ret
from (select distinct device_id, date
      from question_practice_detail) a
       join  (select distinct device_id, date
               from question_practice_detail) b
              on a.device_id = b.device_id
                  and datediff(a.date, b.date) = 1;

所以我第二次就采用外连接的方式也就是left join 因为是取交集所以就可以在被除数的地方直接用left左边也就是主表.device_id来表示被除数,看起来就好很多

select count(b.device_id) / count(a.device_id) avg_ret
from (select distinct device_id, date
      from question_practice_detail) a
left join (select distinct device_id, date
           from question_practice_detail) b
on a.device_id = b.device_id
and datediff(a.date, b.date) = 1;