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时就是第二天没来不再统计,
第二天没来的天数 / 第一天来的天数 = 次日留存率