SQL21 试卷发布当天作答人数和平均分

题目主要信息:

  • 计算每张SQL类别试卷发布后,当天5级以上的用户作答的人数uv和平均分avg_score,按人数降序,相同人数的按平均分升序
  • 平均分保留一位小数
  • 用户信息表user_info(uid用户ID,nick_name昵称, achievement成就值, level等级, job职业方向, register_time注册时间)
  • 试卷信息表examination_info(exam_id试卷ID, tag试卷类别, difficulty试卷难度, duration考试时长, release_time发布时间)
  • 试卷作答记录表exam_record(uid用户ID, exam_id试卷ID, start_time开始作答时间, submit_time交卷时间, score得分)

问题拆分:

  • 以每张试卷分组,即exam_id作为分组依据,便于计算每张试卷的符合条件做了的人数和平均分。知识点:group by
  • 对于每组试卷,我们只挑选类别为SQL、完成试卷的用户等级大于5、试卷发布日期等于试卷提交日期的不同的用户进行统计人数,相同的用户做了多次只统计一次,然后计算平均分:
    • 上述三类要求分布在三个表中,我们可以将exam_record表根据exam_id与examination_info表连接在一起,然后将exam_record表根据uid与user_info连接在一起,这样三个表就连结在一起了。知识点:join...on...
    • 用where语句判断上述三种情况。知识点:where、date()
  • 平均保留一位小数。知识点:round(x,1)
  • 按照人数的降序,相同情况下平均分升序输出。order by uv desc, avg_score asc 知识点:order by

代码:

select e_r.exam_id as exam_id,
       count(distinct e_r.uid) as uv,
       round(avg(score), 1) as avg_score
from exam_record e_r join examination_info e_i
on e_r.exam_id = e_i.exam_id
join user_info u_i
on e_r.uid = u_i.uid
where tag = 'SQL'
and level > 5
and date(release_time) = date(submit_time)
group by exam_id
order by uv desc, avg_score asc