解法一
1、查询总的用户数
select count(distinct user_id) from login
2、查询新用户登录的第二天
select user_id,date_add(min(date), interval 1 day) as date
from login
group by user_id
3、计算新用户次日登录的留存率
select round(count(distinct user_id)/(select count(distinct user_id) from login),3) as p
from login
where (user_id,date) in
(select user_id,date_add(min(date), interval 1 day) as date
from login
group by user_id);
解法二   窗口函数
1、在原表中增加一列每个用户的第一次登录日期
select *, min(date) over (partition by user_id) d from login
2、计算date=d+1 的个数即为次日登录的用户个数,与用户数的比值为留存率
select round(sum(case when date=date_add(d,interval 1 day) then 1 else 0 end)/count(distinct user_id),3) as p
from
(select *, min(date) over (partition by user_id) d from login) as a