思路如下:
本题跟前面的一样,需要列出留存率为0的,所以最后还需要和login做一次链接
先看子查询
1.select user_id,min(date) t_date from login group by user_id 通过子查询找到每个用户第一次登陆的时间
2.(SELECT t.t_date,round(sum(case when l.date-t.t_date=1 then 1 else 0 end)/
count(distinct t.user_id),3) p
from
(select user_id,min(date) t_date from login group by user_id) t
left join login l on l.user_id = t.user_id
group by t.t_date)
通过上述语句 链接两个表,第一个表是login 第二个表则是每个用户的第一次登陆时间
然后利用case语句查询到用户第二天登陆的情况,并根据用户数计算次日留存率。这里的次日留存率是没有为0的日期的
3. 根据最外层语句将次日留存率与login表中的distinct时间相组合,对空值填0,即可
select distinct l2.date,case when p2.p is null then 0 else p2.p end p
from
(SELECT t.t_date,round(sum(case when l.date-t.t_date=1 then 1 else 0 end)/
count(distinct t.user_id),3) p
from
(select user_id,min(date) t_date from login group by user_id) t
left join login l on l.user_id = t.user_id
group by t.t_date) p2
right join login l2
on l2.date = p2.t_date