首页 > 试题广场 >

成绩的百分位排名

[编程题]成绩的百分位排名
  • 热度指数:36 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

表: 成绩表

+------+-----+
| 字段名称 | 类型  |
+------+-----+
| 学号   | int |
| 班级   | int |
| 成绩   | int |
+------+-----+

学号 是该表的主键。
该表的每一行表示 一个班级中一个学生的成绩,包含学号、班级和成绩。

 

编写一个 SQL 查询,得出每个班级学生成绩的百分比排名,排名保留2位小数。

查询结果如下例所示。

 

示例 1:

输入: 表:成绩表
+------+----+----+
| 学号   | 班级 | 成绩 |
+------+----+----+
| 1001 | 1  | 86 |
| 1002 | 1  | 95 |
| 1003 | 2  | 89 |
| 1004 | 1  | 83 |
| 1005 | 2  | 86 |
| 1006 | 3  | 92 |
| 1007 | 3  | 86 |
| 1008 | 1  | 88 |
+------+----+----+ 输出: +------+----+----+-------+
| 学号   | 班级 | 成绩 | 百分位排名 |
+------+----+----+-------+
| 1002 | 1  | 95 | 0     |
| 1008 | 1  | 88 | 0.33  |
| 1001 | 1  | 86 | 0.67  |
| 1004 | 1  | 83 | 1     |
| 1003 | 2  | 89 | 0     |
| 1005 | 2  | 86 | 1     |
| 1006 | 3  | 92 | 0     |
| 1007 | 3  | 86 | 1     |
+------+----+----+-------+ 解释: 使用窗口函数percent_rank()获取百分位排名,获取后使用round()函数保留2位小数。
示例1

输入

CREATE TABLE `成绩表` 
(
    `学号` INT,
    `班级` INT,
    `成绩` INT
);
-- 插入第一组数据
INSERT INTO `成绩表` (`学号`, `班级`, `成绩`) VALUES (1001, 1, 86);
INSERT INTO `成绩表` (`学号`, `班级`, `成绩`) VALUES (1002, 1, 95);
INSERT INTO `成绩表` (`学号`, `班级`, `成绩`) VALUES (1003, 2, 89);
INSERT INTO `成绩表` (`学号`, `班级`, `成绩`) VALUES (1004, 1, 83);
INSERT INTO `成绩表` (`学号`, `班级`, `成绩`) VALUES (1005, 2, 86);
INSERT INTO `成绩表` (`学号`, `班级`, `成绩`) VALUES (1006, 3, 92);
INSERT INTO `成绩表` (`学号`, `班级`, `成绩`) VALUES (1007, 3, 86);
INSERT INTO `成绩表` (`学号`, `班级`, `成绩`) VALUES (1008, 1, 88);

输出

学号|班级|成绩|百分位排名
1002|1|95|0.0
1008|1|88|0.33
1001|1|86|0.67
1004|1|83|1.0
1003|2|89|0.0
1005|2|86|1.0
1006|3|92|0.0
1007|3|86|1.0
头像 牛客987852806号
发表于 2024-07-03 11:37:16
select 学号,班级,成绩, round( percent_rank()over(partition by 班级 order by 成绩 desc),2) as 百分位排名 from 成绩表