解法一:  left join  +count
新用户的用户留存率=新用户第二天登录的数量/新用户第一天登录的数量

1、查询所有的登录日期
select distinct date from login
2、查询每个用户的首次登录日期
select user_id,min(date) as date from login
group by user_id
3、将1表left join 2 表 left join login 表, on login表的日期-2表日期=1;
按date 分组,用户留存率=login表的用户数/2表的用户数
注意:用户数需去重,使用ifnull(,) 函数对空值填充为0
select a.date,ifnull(round(count(distinct c.user_id)/count(distinct b.user_id),3),0) as p
from
(select distinct date from login) as a
left join 
(select user_id,min(date) as date from login
group by user_id) as b
on a.date=b.date
left join 
(select user_id,date from login) as c
on b.user_id=c.user_id and datediff(c.date,b.date)=1
group by a.date
order by a.date;
解法二:sum( case when  then 1 else 0 end )  条件统计求和
1、求分母  每日首次登录的用户数
sum(case when (user_id,date) in (select user_id,min(date) from login group by user_id) then 1 else 0 end)
2、求分子 每日首次登录的用户第二天仍然登录的数量
sum(case when (user_id,date) in (select user_id,min(date) from login group by user_id) 
    and (user_id,date) in (select user_id,date_add(date,interval -1 day) from login)
   then 1 else 0 end)

3、求留存率,注意考虑计算值为空的情况,使用ifnull()函数填充为0

select date ,ifnull(round(sum(case when (user_id,date) in (select user_id,min(date) from login group by user_id) 
    and (user_id,date) in (select user_id,date_add(date,interval -1 day) from login)
   then 1 else 0 end)/sum(case when (user_id,date) in (select user_id,min(date) from login group by user_id) then 1 else 0 end),3),0) as p
   from login 
   group by date
   order by date;