SQL 每个学生去掉最高最低平均分

在处理学生成绩数据的过程中,有时候需要计算学生去掉最高和最低分后的平均分。这种需求常常用于排除极端值干扰,更客观地评价学生的表现。本文将通过 SQL 查询语句实现这一功能。
假设我们有一个名为 student_scores 的表,其中包含了学生的学号 student_id 和对应的考试成绩 score。我们的目标是计算每个学生的平均成绩,但排除掉最高分和最低分后再求平均。
创建示例数据
首先,让我们创建一个包含学生成绩数据的表 student_scores。以下是创建表并插入一些示例数据的 SQL 代码:
CREATE TABLE student_scores (
student_id INT,
score INT
);
INSERT INTO student_scores (student_id, score) VALUES
(1, 80),
(1, 85),
(1, 90),
(1, 95),
(2, 75),
(2, 80),
(2, 85),
(2, 90),
(3, 70),
(3, 75),
(3, 80),
(3, 85);
现在我们已经创建了含有学生成绩数据的表 student_scores,接下来我们将编写 SQL 查询语句来计算每个学生去掉最高和最低成绩后的平均分。
SQL 查询语句
下面是一个使用 SQL 语句计算每个学生去掉最高和最低成绩后的平均分的示例:
WITH ranked_scores AS (
SELECT
student_id,
score,
ROW_NUMBER() OVER (PARTITION BY student_id ORDER BY score) AS rank
FROM
student_scores
)
SELECT
student_id,
AVG(score) AS average_score
FROM
ranked_scores
WHERE
rank > 1 AND rank < (SELECT MAX(rank) FROM ranked_scores WHERE student_id = ranked_scores.student_id)
GROUP BY
student_id;
让我们逐步解释上述查询语句的每个部分:
- 首先,使用
ROW_NUMBER()窗口函数对每个学生的成绩进行排名(按照分数升序排名)。 - 然后,利用 Common Table Expressions (CTE) 将排名结果存储在
ranked_scores临时表中。 - 接着,在主查询中,我们计算每个学生去掉最高和最低成绩后的平均分。我们通过筛选掉排名为 1 和最大排名的记录来实现这一目的。
- 最后,对每个学生的平均分进行求平均并按学生编号进行分组。
运行结果
运行上述 SQL 查询语句后,我们可以得到每个学生去掉最高和最低成绩后的平均分。以下是查询结果:
| student_id | average_score |
|---|---|
| 1 | 87.5 |
| 2 | 82.5 |
| 3 | 77.5 |
通过上表我们可以看到,学生 1 的平均分为 87.5,学生 2 的平均分为 82.5,学生 3 的平均分为 77.5。这些平均分是去掉了每个学生最高和最低成绩后计算得出的。
总之,本文介绍了利用 SQL 查询语句计算每个学生去掉最高和最低成绩后的平均分的方法,并给出了示例代码和运行结果。这种技术可以帮助我们更客观地评价学生的表现,排除极端值的干扰。
极客教程