题解 | #SQL类别高难度试卷得分的截断平均值#
SQL类别高难度试卷得分的截断平均值
https://www.nowcoder.com/practice/a690f76a718242fd80757115d305be45
WITH Rank_view AS( SELECT tag, difficulty, score, ROW_NUMBER() OVER(PARTITION BY a.exam_id ORDER BY score ASC) MIN_SCORE, ROW_NUMBER() OVER(PARTITION BY a.exam_id ORDER BY score DESC) MAX_SCORE FROM examination_info a LEFT JOIN exam_record b ON a.exam_id = b.exam_id WHERE tag = 'SQL' AND difficulty = 'hard' AND score IS NOT NULL ) SELECT tag, difficulty, ROUND(AVG(score), 1) FROM Rank_view WHERE MIN_SCORE > 1 AND MAX_SCORE > 1 GROUP BY tag, difficulty
题解:
1.任务:计算均值
2.限制:sql,hard,去掉一个最大值和最小值
思路:
可以先写个普通的计算均值的代码,然后发现需要找到,或者标识出不是最大值和最小值的得分
最先是想直接在查询中用条件语句中使用极值函数,但是报错,因为是聚合函数,需要使用groupby
因此采用临时表的方式,使用开窗函数进行排序
1.创建临时表,把限制条件进行书写,得到较大范围的限制结果,这里要注意必须在这里过滤掉没有得分的记录
2.根据顺序和倒序排序过滤掉两个极值,avg也是聚合函数,因此最后要使用groupby,同时使用round函数保留一位小数