首页 > 试题广场 >

升序降序排名I

[编程题]升序降序排名I
  • 热度指数:28 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

表: 薪水表

+------+-----+
| 字段名称 | 类型  |
+------+-----+
| 雇员编号 | int |
| 部门编号 | int |
| 薪水   | int |
+------+-----+

雇员编号 是该表的主键。
该表的每一行表示 一个部门中一名雇员的薪水信息,包含雇员编号、部门编号和薪水。

 

编写一个 SQL 查询,得出每个部门雇员的薪水升序降序排名。

查询结果如下例所示。

 

示例 1:

输入: 表:薪水表
+-------+------+-------+
| 雇员编号  | 部门编号 | 薪水    |
+-------+------+-------+
| 10001 | 1    | 60117 |
| 10002 | 2    | 92102 |
| 10003 | 2    | 86074 |
| 10004 | 1    | 66596 |
| 10005 | 1    | 66961 |
| 10006 | 2    | 81046 |
| 10007 | 2    | 94333 |
| 10008 | 1    | 75286 |
| 10009 | 2    | 85994 |
| 10010 | 1    | 76884 |
+-------+------+-------+ 输出: +-------+------+-------+--------+--------+
| 雇员编号  | 部门编号 | 薪水    | 薪水升序排名 | 薪水降序排名 |
+-------+------+-------+--------+--------+
| 10001 | 1    | 60117 | 1      | 5      |
| 10004 | 1    | 66596 | 2      | 4      |
| 10005 | 1    | 66961 | 3      | 3      |
| 10008 | 1    | 75286 | 4      | 2      |
| 10010 | 1    | 76884 | 5      | 1      |
| 10006 | 2    | 81046 | 1      | 5      |
| 10009 | 2    | 85994 | 2      | 4      |
| 10003 | 2    | 86074 | 3      | 3      |
| 10002 | 2    | 92102 | 4      | 2      |
| 10007 | 2    | 94333 | 5      | 1      |
+-------+------+-------+--------+--------+ 解释: 使用排序窗口函数,按部门编号分组(partition by 部门编号),按薪水进行升序(order by 薪水 asc)和降序(order by 薪水 desc)排序即可得出对应排名。
示例1

输入

CREATE TABLE `薪水表` 
(
    `雇员编号` INT,
    `部门编号` INT,
    `薪水` INT
);
INSERT INTO `薪水表` (`雇员编号`, `部门编号`, `薪水`) VALUES (10001, 1, 60117);
INSERT INTO `薪水表` (`雇员编号`, `部门编号`, `薪水`) VALUES (10002, 2, 92102);
INSERT INTO `薪水表` (`雇员编号`, `部门编号`, `薪水`) VALUES (10003, 2, 86074);
INSERT INTO `薪水表` (`雇员编号`, `部门编号`, `薪水`) VALUES (10004, 1, 66596);
INSERT INTO `薪水表` (`雇员编号`, `部门编号`, `薪水`) VALUES (10005, 1, 66961);
INSERT INTO `薪水表` (`雇员编号`, `部门编号`, `薪水`) VALUES (10006, 2, 81046);
INSERT INTO `薪水表` (`雇员编号`, `部门编号`, `薪水`) VALUES (10007, 2, 94333);
INSERT INTO `薪水表` (`雇员编号`, `部门编号`, `薪水`) VALUES (10008, 1, 75286);
INSERT INTO `薪水表` (`雇员编号`, `部门编号`, `薪水`) VALUES (10009, 2, 85994);
INSERT INTO `薪水表` (`雇员编号`, `部门编号`, `薪水`) VALUES (10010, 1, 76884);

输出

雇员编号|部门编号|薪水|薪水升序排名|薪水降序排名
10010|1|76884|5|1
10008|1|75286|4|2
10005|1|66961|3|3
10004|1|66596|2|4
10001|1|60117|1|5
10007|2|94333|5|1
10002|2|92102|4|2
10003|2|86074|3|3
10009|2|85994|2|4
10006|2|81046|1|5
select 
雇员编号
,部门编号
,薪水
,rank() over(partition by 部门编号 order by 薪水) as 薪水升序排名
,rank() over(partition by 部门编号 order by 薪水 desc) as 薪水降序排名
from 薪水表

发表于 2025-11-12 14:59:41 回复(0)