首页 > 试题广场 >

学生成绩累计求和

[编程题]学生成绩累计求和
  • 热度指数:32 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

表: 学生成绩表

+------+-----+
| 字段名称 | 类型  |
+------+-----+
| 学号   | int |
| 课程号  | int |
| 成绩   | int |
+------+-----+

学号和课程号 组成该表的联合主键。
该表的每一行表示 一个学生一个课程的成绩,包含学号、课程号和成绩。

 

编写一个 SQL 查询,得出成绩从大到小排列之后的累计求和值。

查询结果如下例所示。

 

示例 1:

输入: 表:学生成绩表
+------+------+----+
| 学号   | 课程号  | 成绩 |
+------+------+----+
| 1001 | 1003 | 99 |
| 1001 | 1002 | 90 |
| 1001 | 1001 | 80 |
| 1002 | 1003 | 80 |
| 1003 | 1001 | 80 |
| 1003 | 1002 | 80 |
| 1003 | 1003 | 80 |
| 1002 | 1002 | 60 |
+------+------+----+ 输出: +------+------+----+------+
| 学号   | 课程号  | 成绩 | 累计成绩 |
+------+------+----+------+
| 1001 | 1003 | 99 | 99   |
| 1001 | 1002 | 90 | 189  |
| 1001 | 1001 | 80 | 269  |
| 1002 | 1003 | 80 | 349  |
| 1003 | 1001 | 80 | 429  |
| 1003 | 1002 | 80 | 509  |
| 1003 | 1003 | 80 | 589  |
| 1002 | 1002 | 60 | 649  |
+------+------+----+------+ 解释: 使用移动窗口函数来计算累计值,语法为:窗口函数 over(partition by < 要分组的列名 >order by < 要排序的列名 >rows between < 范围起始行 > and < 范围终止行 >)。
示例1

输入

CREATE TABLE `学生成绩表` 
(
    `学号` INT,
    `课程号` INT,
    `成绩` INT
);
-- 插入第一组数据
INSERT INTO `学生成绩表` (`学号`, `课程号`, `成绩`) VALUES (1001, 1003, 99);
INSERT INTO `学生成绩表` (`学号`, `课程号`, `成绩`) VALUES (1001, 1002, 90);
INSERT INTO `学生成绩表` (`学号`, `课程号`, `成绩`) VALUES (1001, 1001, 80);
INSERT INTO `学生成绩表` (`学号`, `课程号`, `成绩`) VALUES (1002, 1003, 80);
INSERT INTO `学生成绩表` (`学号`, `课程号`, `成绩`) VALUES (1003, 1001, 80);
INSERT INTO `学生成绩表` (`学号`, `课程号`, `成绩`) VALUES (1003, 1002, 80);
INSERT INTO `学生成绩表` (`学号`, `课程号`, `成绩`) VALUES (1003, 1003, 80);
INSERT INTO `学生成绩表` (`学号`, `课程号`, `成绩`) VALUES (1002, 1002, 60);

输出

学号|课程号|成绩|累计成绩
1001|1003|99|99
1001|1002|90|189
1001|1001|80|269
1002|1003|80|349
1003|1001|80|429
1003|1002|80|509
1003|1003|80|589
1002|1002|60|649
select 学号,课程号,成绩,sum(成绩) over(order by rk) as 累计成绩
from
(select
*
,row_number() over(order by 成绩 desc) as rk
from 学生成绩表) e
发表于 2025-11-12 15:27:00 回复(0)