题解 | #SQL类别高难度试卷得分的截断平均值#
SQL类别高难度试卷得分的截断平均值
https://www.nowcoder.com/practice/a690f76a718242fd80757115d305be45
/*解法一
SELECT ei.tag, ei.difficulty, round(avg(er.score), 1) clip_avg_score
FROM (
SELECT *, RANK() OVER (ORDER BY score DESC) de_rk,
RANK() OVER (ORDER BY score) as_rk
FROM exam_record
WHERE score is not null
) AS er
INNER JOIN examination_info ei ON er.exam_id = ei.exam_id
WHERE er.as_rk != 1 AND er.de_rk != 1 AND ei.tag = 'SQL' and ei.difficulty = 'hard'
GROUP BY ei.tag, ei.difficulty
*/
/*解法二:新建一个表t*/
WITH t AS (
SELECT ei.tag, ei.difficulty, er.score, RANK() OVER (ORDER BY er.score DESC) de_rk,
RANK() OVER (ORDER BY er.score) as_rk
FROM exam_record er
INNER JOIN examination_info ei
USING (exam_id)
WHERE
score is not null
and ei.tag = 'SQL'
and ei.difficulty = 'hard'
)
SELECT tag, difficulty, round(avg(score),1) as clip_avg_score
FROM t
WHERE t.de_rk != 1 and t.as_rk != 1
GROUP BY tag, difficulty
饿解法一:将成绩记录表er和考试信息表ei连接起来,在连接之前先在er里面增加两列排序的,窗口函数,这样在计算阶段平均分时可以将降序和升序为1的都去掉。同时,要将score为空的也去掉,因为在用RANK()函数时,NULL值也会进行排序。GROUP BY 是为了能够在SELECT中显示字段
解法二:将两个表连接之后,增加排序的两个列,作为一个新表t,再从表t中检索想要的信息
