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

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

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;

让我们逐步解释上述查询语句的每个部分:

  1. 首先,使用 ROW_NUMBER() 窗口函数对每个学生的成绩进行排名(按照分数升序排名)。
  2. 然后,利用 Common Table Expressions (CTE) 将排名结果存储在 ranked_scores 临时表中。
  3. 接着,在主查询中,我们计算每个学生去掉最高和最低成绩后的平均分。我们通过筛选掉排名为 1 和最大排名的记录来实现这一目的。
  4. 最后,对每个学生的平均分进行求平均并按学生编号进行分组。

运行结果

运行上述 SQL 查询语句后,我们可以得到每个学生去掉最高和最低成绩后的平均分。以下是查询结果:

student_id average_score
1 87.5
2 82.5
3 77.5

通过上表我们可以看到,学生 1 的平均分为 87.5,学生 2 的平均分为 82.5,学生 3 的平均分为 77.5。这些平均分是去掉了每个学生最高和最低成绩后计算得出的。

总之,本文介绍了利用 SQL 查询语句计算每个学生去掉最高和最低成绩后的平均分的方法,并给出了示例代码和运行结果。这种技术可以帮助我们更客观地评价学生的表现,排除极端值的干扰。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程