自己想出来的一种更简便更好理解的解法。 第一步我们把同一天的同一用户去重。 第二步我们做有条件的sum求和, 从这个新的表里拿出每一天的数据,看它之后的一天是否也在原表中有数据, 有则代表他次日留存了,记1,没有则记0。 第三步我们把留存数除以访问总数count(*)即可, 这里没有除直接用了一个avg是一样的结果 select avg(if(date_add(date, interval 1 day) in (select date from question_practice_detail t2 where t1.device_id = t2.device_id),1,0)) as avg...