首先根据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));