题解 | #试卷发布当天作答人数和平均分#
试卷发布当天作答人数和平均分
http://www.nowcoder.com/practice/5b58e89556dc4153a79d8cf8c08ba499
看到三张表想到连接表,观察user_info和examination_info表原则上按顺序不重复,起辅助作用,而exam_record是主要信息表,则选择exam_record为主表join连接其余两表。我们可以先把需要的信息查询出来看看结果如何再进行分析。
select er.uid ,level , er.exam_id, tag, release_time, start_time,submit_time ,score
from exam_record er
join examination_info ei on er.exam_id =ei.exam_id
join user_info ui on er.uid =ui.uid
部分结果如下:
题目要求:请计算每张SQL类别试卷发布后,当天5级以上的用户作答的人数uv和平均分avg_score,按人数降序,相同人数的按平均分升序。
我们加筛选条件:
where tag ='SQL' ##类别为sql试卷
and submit_time > release_time ##表明作答时间在发布时间后
and DATE_FORMAT(submit_time,'%Y%m%d')=DATE_FORMAT(release_time,'%Y%m%d') ##当天作***d level >5 ##5级以上
结果如下:
我们看到uid有重复的,计算人数时需要distinct去重,平均分直接用avg() ,取一位小数用round()。
根据exam_id分组即可得到答案:
#最终结果:
select er.exam_id ,count(DISTINCT er.uid) uv , round(avg(score),1) avg_score
from exam_record er
join examination_info ei on er.exam_id =ei.exam_id
join user_info ui on er.uid =ui.uid
where tag ='SQL'
and submit_time > release_time
and DATE_FORMAT(submit_time,'%Y%m%d')=DATE_FORMAT(release_time,'%Y%m%d')
and level >5
group by er.exam_id
order by uv desc , avg_score asc