这道题的关键在于建立一个包含+1day信息的新表,并与原表关联 关联条件为user_id和日期一致。
这里有个关键点是用户可能存在重复登陆的情况,而题目只是想要找到次日留存 而不是多日留存,因此关联的结果的user_id需要进行去重来统计数量作为分子。同理,分母也需要去重。
SELECT
ROUND
((
SELECT COUNT(DISTINCT(l.user_id))
FROM login l
INNER JOIN
(
SELECT user_id,DATE_ADD(DATE,INTERVAL 1 DAY) date_in
FROM login
)a
ON a.user_id = l.user_id AND l.date = a.date_in
)/
(
SELECT COUNT(DISTINCT(user_id))
FROM login
WHERE DATE NOT IN
(
SELECT MAX(DATE)
FROM login
)
),3) p