留存率公式:
留存率 = (第一天且第二天均登录的用户数)/(总的用户数)

第一步:获得总的用户数

select
    count(distinct user_id)
from login

第二步:构建新表,在原表的基础上以min(date)为基础构建第二天字段

select
    user_id,
    date_add(min(date), interval 1 day) next_day
from login
group by user_id

第三步:从原表的user_id和date两个字段作为查询条件在第二步构建的新表中对user_id进行计数,即可获得第一天且第二天均登录的用户数

select
    count(distinc user_id)
from login
where (user_id, date)
in (
    select
        user_id,
        date_add(min(date), interval 1 day) next_day
    from login
    group by user_id
    )

最后,根据公式,获得留存率,即最终SQL

select 
    round(count(distinct user_id) / (
        select 
            count(distinct user_id)
        from login), 3) p
from login
where (user_id, date) 
in (
    select
            user_id, 
            date_add(min(date), interval 1 day) next_date 
    from login
    group by user_id
    )