题解 | #SQL类别高难度试卷得分的截断平均值#

SQL类别高难度试卷得分的截断平均值

http://www.nowcoder.com/practice/a690f76a718242fd80757115d305be45

开窗函数解法

看了别的大佬的题解才发现搞复杂了

  • 思路:考虑到多个分数重复的情况,利用row_number() over()窗口函数对exam_id分区,对score分别进行顺序排列(t_rank1)和倒序排列(t_rank2)。
  • 因为窗口函数不像max()和min()会自动忽略null值,所以要在where子句把null值(即没做完的卷子分数)去掉。否则row_number也会对它们排序。
  • 最后选定t_rank1 != 1 和t_rank2 != 1即可去掉最大值和最小值。
select t.tag, t.difficulty, round(avg(t.score),1) as clip_avg_score
from (select ei.exam_id, ei.tag, ei.difficulty, er.score
      ,ROW_NUMBER() over(PARTITION by er.exam_id order by er.score) as t_rank1
      ,ROW_NUMBER() over(PARTITION by er.exam_id order by er.score desc) as t_rank2
      from examination_info ei join exam_record er on ei.exam_id = er.exam_id 
      and ei.difficulty = 'hard'
      and ei.tag = 'SQL'
      where er.score is not null
     )t
where t.t_rank1 != 1
and t.t_rank2 != 1
全部评论
大佬 为何我复制你的代码执行出错
点赞 回复 分享
发布于 2023-11-25 20:35 北京
大佬,为啥不能这样子? select t.tag,t.difficulty,round(avg(t.score),1) as clip_avg_score from(select ei.exam_id,ei_tag,ei_difficulty,er.score, row_number()over (participation by er.exam_id order by er.score) as t_rank1, row_number()over (participation by er.exam_id order by er.score desc) as t_rank2 from examination_record as er left join examination_info as ei on er.exam_id=ei.exam_id where t_rank1 !=1 and t_rank2!=1) as t where t.tag='SQL' and t.difficulty='hard'
点赞 回复 分享
发布于 2023-11-25 20:27 北京

相关推荐

评论
11
收藏
分享

创作者周榜

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