题解 | #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中检索想要的信息

全部评论

相关推荐

05-12 16:04
已编辑
江西财经大学 Java
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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