表: 学生成绩表 +------+-----+ 字段名称 类型 +------+-----+ 学号 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
加载中...