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

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

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

SELECT
    tag,
    difficulty,
    ROUND(AVG(score),1) as clip_avg_score
FROM(
    SELECT
        tag,
        difficulty,
        score,
        max_score
    FROM(
        SELECT
            tag,
            difficulty,
            score,
            MIN(score) OVER() as min_score,
            MAX(score) OVER() as max_score
        FROM(
            SELECT
                e.difficulty,
                e.tag,
                er.score
            FROM examination_info e
            INNER JOIN exam_record er
            ON e.exam_id = er.exam_id
                AND (er.score IS NOT NULL AND e.tag = 'SQL')
                    AND e.difficulty = 'hard'
        )t
    )t1
    WHERE score != min_score
)t2
WHERE score != max_score
GROUP BY tag,difficulty

写题前一定要把各个字段看清楚,不然搞半天发现字段写错了。

1 内层循环先进行表的连接,然后过滤score为NULL、tag为'SQL'、difficulty为'hard'的所有记录;

2 再往外一层循环找到当前记录的最大值和最小值

3 外面的两层循环,一次是找到当前score不等于最小值的所有记录;一次循环是找到当前score不等于最大值的所有记录;

SELECT
    tag,
    difficulty,
    ROUND(AVG(score), 1) as clip_avg_score
FROM(
    SELECT
        e.tag,
        e.difficulty,
        er.score,
        RANK() OVER(order by score DESC) as max_rk,
        RANK() OVER(order by score ASC) as min_rk
    FROM examination_info e
    INNER JOIN exam_record er
    ON e.exam_id = er.exam_id
        AND (er.score IS NOT NULL AND e.tag = 'SQL')
            AND e.difficulty = 'hard'
)t
WHERE max_rk <> 1 AND min_rk <> 1
GROUP BY tag, difficulty

这个方法中,连接方法和上面相同,不同的是在连接的时候使用RANK() 窗口函数对score进行正反向的排序

外层循环使用 <> 非等号来进行排序名次的筛选,进而可以过滤掉最大值和最小值.

最后使用 group by 进行分组,统计score的平均值即可.

全部评论

相关推荐

头像
04-29 10:53
已编辑
东北大学 自动化类
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务