题解 | #试卷发布当天作答人数和平均分#
试卷发布当天作答人数和平均分
https://www.nowcoder.com/practice/5b58e89556dc4153a79d8cf8c08ba499
思路
前言:虽然有三张表,但是第一张用户表其实只是用来满足题目要求筛选5级以上用户的,
其次此题只是让我们求sql题目,所以第二张表的作用就是筛选tag和examid的
题目要求
请计算每张SQL类别试卷发布后,当天5级以上的用户作答的人数uv和平均分avg_score,按人数降序,相同人数的按平均分升序
- 对于第一句话 每张SQL类别试卷发布后, 我们确定了where或者having筛选条件,
- 第三张表中的exam_id = (tag=SQL字段)的exam_id,其中tag=SQL为关键,exam_id为联表条件
from exam_record a left join examination_info b on a.exam_id=b.exam_id where tag = 'SQL'
- 第二句话前半句 当天5级以上的用户作答的人数uv
- 当天 ---> 第三张表作答表的submit_time和第二张表的 release_time 使用date_format(xxx_time,"%y%m%d")相等为条件
and date_format(a.start_time,'%y%m%d') = date_format(b.release_time,'%y%m%d')
- 5级用第一张表和第三张表查询到level字段为5
and uid in ( select uid from user_info where level>5 )
- 后半句平均分avg_score
- 最后使用exam_id来分组,筛选出的数据进行avg即可
select a.exam_id, count(distinct a.uid) as uv, round(avg(a.score),1) as avg_score ...... group by a.exam_id order by uv desc , avg_score asc;
代码实现
select a.exam_id, count(distinct a.uid) as uv, round(avg(a.score),1) as avg_score from exam_record a left join examination_info b on a.exam_id=b.exam_id where tag = 'SQL' and date_format(a.start_time,'%y%m%d') = date_format(b.release_time,'%y%m%d') and a.uid in ( select uid from user_info where level>5 ) group by a.exam_id order by uv desc , avg_score asc;