sql script
-- new user every day numbers
select date, count(user_id) as new_number
from (select user_id, min(date) as date
from login
group by user_id) tmp
group by date
-- second day user login
select user_id, date
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)
-- first second day login user_id and first_day
select date, count(user_id) as second_number
from (select user_id, min(date) as date
from login
where user_id in (select user_id
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))
group by user_id) tmp
group by date
-- exists day rate
select new.date, round(second.second_number/new.new_number,3)
from (select date, count(user_id) as new_number
from (select user_id, min(date) as date
from login
group by user_id) tmp
group by date) as new,
(select date, count(user_id) as second_number
from (select user_id, min(date) as date
from login
where user_id in (select user_id
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))
group by user_id) tmp
group by date) as second
where new.date=second.date
-- result
select l.date, coalesce(tmp_day.p, 0.000)
from (select distinct date from login) l
left join (select new.date as date, round(second.second_number/new.new_number,3) as p
from (select date, count(user_id) as new_number
from (select user_id, min(date) as date
from login
group by user_id) tmp
group by date) as new,
(select date, count(user_id) as second_number
from (select user_id, min(date) as date
from login
where user_id in (select user_id
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))
group by user_id) tmp
group by date) as second
where new.date=second.date) tmp_day on l.date=tmp_day.date