表: 成绩表 +------+-----+ 字段名称 类型 +------+-----+ 课程号 int 学号 int 成绩 int +------+-----+ 课程号和学号 组成该表的联合主键。 该表的每一行表示 一个课程中一个学生的成绩,包含课程号、学号和成绩。 编写一个 SQL 查询,得出每门课程的学生成绩排名,如果出现同样成绩的情况,则视为同一名次。 查询结果如下例所示。 示例 1: 输入: 表:成绩表 +------+------+----+ 课程号 学号 成绩 +------+------+----+ 1001 1001 80 1001 1003 80 1002 1001 90 1002 1003 80 1002 1002 60 1002 1004 55 1003 1001 99 1003 1002 80 1003 1003 80 +------+------+----+ 输出: +------+------+----+----+ 课程号 学号 成绩 排名 +------+------+----+----+ 1001 1001 80 1 1001 1003 80 1 1002 1001 90 1 1002 1003 80 2 1002 1002 60 3 1002 1004 55 4 1003 1001 99 1 1003 1002 80 2 1003 1003 80 2 +------+------+----+----+ 解释: 使用排序窗口函数按课程号分组(partition by 课程号),对每组学生按成绩排名(order by 成绩 desc),因为若出现同样成绩的情况,则视为同一名次(并列排名),所以此处使用dense_rank()函数。
示例1
输入
CREATE TABLE `成绩表`
(
`课程号` INT,
`学号` INT,
`成绩` INT
);
-- 插入第一组数据
INSERT INTO `成绩表` (`课程号`, `学号`, `成绩`) VALUES (1001, 1001, 80);
INSERT INTO `成绩表` (`课程号`, `学号`, `成绩`) VALUES (1001, 1003, 80);
INSERT INTO `成绩表` (`课程号`, `学号`, `成绩`) VALUES (1002, 1001, 90);
INSERT INTO `成绩表` (`课程号`, `学号`, `成绩`) VALUES (1002, 1003, 80);
INSERT INTO `成绩表` (`课程号`, `学号`, `成绩`) VALUES (1002, 1002, 60);
INSERT INTO `成绩表` (`课程号`, `学号`, `成绩`) VALUES (1002, 1004, 55);
INSERT INTO `成绩表` (`课程号`, `学号`, `成绩`) VALUES (1003, 1001, 99);
INSERT INTO `成绩表` (`课程号`, `学号`, `成绩`) VALUES (1003, 1002, 80);
INSERT INTO `成绩表` (`课程号`, `学号`, `成绩`) VALUES (1003, 1003, 80);
输出
课程号|学号|成绩|排名
1001|1001|80|1
1001|1003|80|1
1002|1001|90|1
1002|1003|80|2
1002|1002|60|3
1002|1004|55|4
1003|1001|99|1
1003|1002|80|2
1003|1003|80|2
加载中...