这道题的有趣之处在于,之前的解题思路一般是一般是开局多张表,以“你希望看到怎样一张最终表”入手,多表归一得到最终表后解决。而这次就一张表,2个有效变量,人id,答题时间,问题不在信息没汇总,而在于汇总过度,需要先将其先分裂再归一,才能得到真正的最终表

先考虑如何得到第二天来作题的人的数据,一个错误思路是:

select distinct device_id, date from question_practice_detail 
where date in (select date_add(date,interval 1 day) from question_practice_detail)

像这么做就是错的,因为筛选没有对device_id构成约束。

正确做法是分裂后再join,依靠join条件对时间、人员进行双重限制

select * from
(select distinct device_id,date from question_practice_detail) as q
left join
(select distinct device_id, date_add(date,interval 1 day) as datee from 
question_practice_detail) as nq
on nq.device_id=q.device_id and nq.datee=q.date

然后依靠此最终表得到结果

select count(distinct nq.device_id,datee)/count(distinct q.device_id,date) 
from question_practice_detail q
left join
(select distinct device_id, date_add(date,interval 1 day) as datee from 
question_practice_detail) as nq
on nq.device_id=q.device_id and nq.datee=q.date