with new_login as (
    select 
        ifnull(cnt, 0) as new_cnt,
        login.date
    from
        login 
        left join (
            select
                count(*) as cnt,
                date
            from login
            where (user_id, date) in (select user_id, min(date) from login group by user_id)
            group by date
        )as first_login on login.date = first_login.date
    group by date
),
keep_user as (
    select 
        count(distinct user_id) as keep_cnt,
        date
    from login
    where (user_id, date) in 
        (select user_id, date_add(min(date), interval 1 day) from login group by user_id)
    group by date
)
select
    new_login.date,
    round(ifnull(keep_cnt/new_cnt, 0), 3) as p
from    
    new_login
    left join keep_user on new_login.date = date_sub(keep_user.date, interval 1 day)