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

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

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

相关推荐

07-03 11:02
中山大学 C++
字节刚oc,但距离九月秋招很近了有两段互联网实习,非腾讯字节。不敢赌转正,现在在纠结去还是不去如果实习俩月离职会有什么后果吗
阿城我会做到的:不去后悔一辈子,能否转正取决于ld的态度,只要他不卡,答辩就是走流程,个人觉得可以冲一把
投递字节跳动等公司8个岗位
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务