题目要求计算截断平均值,去掉一个最大值和一个最小值而非去掉极值,故可以用窗口函数row_number()over()对成绩进行排序,我这里先筛选出SQL类别高难度试卷按成绩升序排序和降序排序的表组成一个新表,继而再从新表中SELECT出截断平均值。
一开始我没有加GROUP BY函数,运行时出现了一个bug:
也就是说,mysql的sql_mode是only_full_group_by的时候,在不使用group by 并且select后面出现聚集函数的话,那么所有被select的都应该是聚集函数,否则就会报错。果不其然,我后面加上group by便运行通过了。
SELECT tag, difficulty, ROUND(AVG(score) ,1) as clip_avg_score
FROM (
SELECT tag, difficulty, score,
ROW_NUMBER()OVER(ORDER BY score ASC) as rank1,
ROW_NUMBER()OVER(ORDER BY score DESC) as rank2
FROM examination_info JOIN exam_record USING(exam_id)
WHERE tag = 'SQL' AND difficulty = 'hard' AND score IS NOT NULL
) t
WHERE t.rank1 >= 2 AND t.rank2 >= 2
GROUP BY tag, difficulty