题解 | #试卷发布当天作答人数和平均分#

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

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;
全部评论

相关推荐

01-17 08:34
门头沟学院 Java
想找对象的单身狗在努力存钱:这工资不低了,再高点人家要招博士硕士的
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务