题解 | 21. 试卷发布当天答题人数和平均分(不只是题解,很啰嗦,可能会浪费你的一些时间,谨慎选择是否点开.)
试卷发布当天作答人数和平均分
http://www.nowcoder.com/practice/5b58e89556dc4153a79d8cf8c08ba499
纯限时40分钟写的,因为昨天晚上有一题子查询思路错了,然后就回宿舍打游戏了,白天上课无聊就看了下那道题的讨论,算是巩固了一些子查询吧。
这题呢,因为看题目大纲是可以知道他是子查询的,所以思路很明确,先判断出哪些是需要子查询的,看了就发现三个表都有exam_id,所以子查询就当然要用到他了,那就先写出子查询的select,这样一步一步来就会豁然开朗,我一开始还以为他需要多嵌套一个子查询,所以留了很多位置,后来多看了会题目发现可以不用。其次还遇到了很多个坑,比如:1.有一个人 一张试卷做了两次,但是如果直接count会多一个出来,所以就需要去重。 2.牛客给的表格里面1001做9001的开始时间是在9001发布之前两个月开始的,这个也要注意,不然子查询里面的where容易写错。
还有就是自己的一些错误导致花费了一些时间在上面:1.在写uv具体该count谁的时候,因为有很多选项可以选择count,我一开始没犯傻了,选择去count(level),最后会少一个。2.还有就是当天答题的人数是有歧义的,我一开始比较傻,直接选择start_time去了,其实仔细看题会发现他还要求平均分的,那么肯定得是submit_time才能满足要求。
select er.exam_id,
count(distinct ui.uid) as uv,
round(sum(score) / count(submit_time),1) as avg_score
from exam_record er
join user_info ui using(uid)
where ui.level>5 and
exam_id in (select exam_id
from exam_record
join examination_info using(exam_id)
where DATE_FORMAT(submit_time,'%Y%m%d') = DATE_FORMAT(release_time,'%Y%m%d'))
group by er.exam_id
order by uv DESC,avg_score