select round(c_user_id/t_user_id,3) as q
from (select count(distinct user_id) as t_user_id from login) as t,
(select count(mmt.user_id) as c_user_id
from login as l
left outer join
(select user_id, min(date)+1 as mt from login group by user_id) as mmt
on l.user_id = mmt.user_id
where date = mt) as c;
这种做法大概有一些剑走偏锋。最后将两者联结起来这里,我并不满意。
讲一讲我做这道题的思路吧。
首先,检索出一共有多少用户,并放在一边,暂时不用管;
其次,检索出每个用户及其最早登录的时间,即初次登录;
那么,我们只需要将初次登录的时间再加上1,就是假设左右用户都在第二天登录了,即此时留存率为1;
然后,我们将第三步检索出来的临时表与原表相结合,并设置on l.user_id = mmt.user_id and date = mt
,此时可以用来检验实际上有多少用户在第二天登录了。
最后,将第一步得出的总用户数和上一步得出的留存用户数比较,就得出了留存率。