WITH fd AS
(SELECT
user_id,
MIN(date) first_date
FROM login
GROUP BY user_id),
second_day_log_num AS
(SELECT
l1.date,
COUNT(DISTINCT l1.user_id) sd_num
FROM login l1
JOIN fd ON l1.date = DATE_ADD(fd.first_date, INTERVAL 1 DAY) AND fd.user_id = l1.user_id
GROUP BY l1.date),
day_log_num AS
(SELECT
l1.date,
IFNULL(COUNT(DISTINCT fd.user_id),0) num
FROM login l1
LEFT JOIN fd ON fd.first_date = l1.date AND fd.user_id = l1.user_id
GROUP BY l1.date)
SELECT
dn.date,
ROUND(IFNULL(sd_num/num, 0), 3) p
FROM day_log_num dn
LEFT JOIN second_day_log_num sn ON dn.date = DATE_ADD(sn.date, INTERVAL -1 DAY)
ORDER BY dn.date