SELECT visit_date,dau,next_day_per FROM(
-- 日活
SELECT
    visit_date,
    COUNT(id) dau
FROM
    user_visit_log
GROUP BY
    visit_date) t2
, -- 两表连接
-- 次日留存率
(SELECT 
    date1,
    COUNT(date2)/COUNT(date1) next_day_per
FROM(
    SELECT 
        date1,
        date2 
    FROM (
        (SELECT  
            id,
            visit_date AS date1
         FROM user_visit_log) AS uvl1
LEFT JOIN
(SELECT  id,visit_date AS date2 FROM user_visit_log) AS uvl2
ON uvl1.id = uvl2.id 
AND DATE_ADD(uvl1.date1,INTERVAL 1 DAY) = uvl2.date2)

) AS t1
GROUP BY date1) t3
WHERE t2.visit_date = t3.date1

写次日留存率这类题目,就拿出一张表(表1)中的date当作第一天(去重当天连续多次登录的用户),与另一张表(表2)连接,条件是表1的date加一天=表2。这样输出了一个具有第一天date1和第二天date2的表

然后统计count(date1)和count(date2) ,当date2为null时就是第二天没来不再统计,

第二天没来的天数 / 第一天来的天数 = 次日留存率