首先根据user_id分区,分区中根据日期降序,取rank排名第一的及是新用户的第一天登录,然后跟原表join内连接id和第一天日期的第二天相等作为条件就好,最后convert保留小数点。
SELECT CONVERT((SELECT COUNT(1) FROM (SELECT user_id, date FROM (SELECT user_id, date, rank() over (PARTITION BY user_id ORDER BY date) r FROM login) a WHERE a.r = 1 GROUP BY user_id, date) b INNER JOIN login WHERE b.user_id = login.user_id AND login.date = date_add(b.date, INTERVAL 1 day)) / (SELECT COUNT(DISTINCT user_id) FROM login), DECIMAL(10, 3));