这道题的有趣之处在于,之前的解题思路一般是一般是开局多张表,以“你希望看到怎样一张最终表”入手,多表归一得到最终表后解决。而这次就一张表,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