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,此时可以用来检验实际上有多少用户在第二天登录了。

最后,将第一步得出的总用户数和上一步得出的留存用户数比较,就得出了留存率。