这道题,贵为困难题,自然是,正常做必有坑:我有一种方法一直不通关 错误写法: select count(distinct b.device_id)/count(distinct a.device_id) as avg_ret from question_practice_detail a left join question_practice_detail b on date_add(a.date,interval 1 day)=b.date and a.device_id=b.device_id; 正确写法: select count(distinct b.device_id,b.date)/count(distinct a.device_id,a.date) as avg_ret from question_practice_detail a left join question_practice_detail b on date_add(a.date,interval 1 day)=b.date and a.device_id=b.device_id; 两者最大的区别在于第3行与第8行 经反思与思考,之所以错,是应为b是一个新表, 如果仅用b.device_id的话,相当于仅有第一个条件a.device_id=b.device_id;成立,而date_add(a.date,interval 1 day)=b.date不成立, 唯有将id与日期全部绑定,才能,让两个条件同时生效。 并且,count本身并不能实现多列,但是distinct能将多列变成一个组。故-就能用count查询了 !!!之所以,将date与id关联,是应为,同一个用户,在其他日期还会刷题,不能因此就粗心的用distinct把用户给去除了 所以本题重点,就是将 id与date关联起来,一起判断。