题解 | 计算用户的平均次日留存率
计算用户的平均次日留存率
https://www.nowcoder.com/practice/126083961ae0415fbde061d7ebbde453
SELECT
COUNT(DISTINCT CONCAT(q2.device_id, '-', q2.date)) / COUNT(DISTINCT CONCAT(q1.device_id, '-', q1.date)) AS avg_ret
FROM
question_practice_detail AS q1
LEFT OUTER JOIN
question_practice_detail AS q2
ON
q1.device_id = q2.device_id AND DATEDIFF(q2.date, q1.date) = 1;
使用 LEFT OUTER JOIN 意味着即使 q1 表中的某些记录在 q2 表中没有对应的次日记录(也就是用户在次日没有答题),这些记录也会被保留在结果集中,q2 表对应的字段会显示为 NULL。
区别:
LEFT JOIN(也称为 LEFT OUTER JOIN):以左表为基础,返回左表中的所有记录,以及右表中匹配的记录。如果右表中没有与左表匹配的记录,那么右表的相关列将显示为 NULL。
INNER JOIN:只返回两个表中匹配的记录,即只有当左表和右表中的记录满足连接条件时,才会出现在结果集中。


