表: 雇员表 +------+-----+ 字段名称 类型 +------+-----+ 工号 int 工资 int 部门编号 int +------+-----+ 工号 是该表的主键。 该表的每一行表示 一个部门中一个员工的工资,包含工号、工资和部门编号。 编写一个 SQL 查询,得出每个部门的员工工资排名,如果出现同样工资的情况,则视为同一名次。 查询结果如下例所示。 示例 1: 输入: 表:雇员表 +----+-------+------+ 工号 工资 部门编号 +----+-------+------+ 1 85000 1 2 80000 2 3 60000 2 4 90000 1 5 69000 2 6 85000 1 7 70000 1 +----+-------+------+ 输出: +----+-------+------+----+ 工号 工资 部门编号 排名 +----+-------+------+----+ 4 90000 1 1 1 85000 1 2 6 85000 1 2 7 70000 1 3 2 80000 2 1 5 69000 2 2 3 60000 2 3 +----+-------+------+----+ 解释: 使用排序窗口函数按课程号分组(partition by 部门编号),对每组学生按成绩排名(order by 工资 desc),因为若出现同样成绩的情况,则视为同一名次(并列排名),所以此处使用dense_rank()函数。
示例1

输入

CREATE TABLE `雇员表` 
(
    `工号` INT,
    `工资` INT,
    `部门编号` INT
);
-- 插入第一组数据
INSERT INTO `雇员表` (`工号`, `工资`, `部门编号`) VALUES (1, 85000, 1);
INSERT INTO `雇员表` (`工号`, `工资`, `部门编号`) VALUES (2, 80000, 2);
INSERT INTO `雇员表` (`工号`, `工资`, `部门编号`) VALUES (3, 60000, 2);
INSERT INTO `雇员表` (`工号`, `工资`, `部门编号`) VALUES (4, 90000, 1);
INSERT INTO `雇员表` (`工号`, `工资`, `部门编号`) VALUES (5, 69000, 2);
INSERT INTO `雇员表` (`工号`, `工资`, `部门编号`) VALUES (6, 85000, 1);
INSERT INTO `雇员表` (`工号`, `工资`, `部门编号`) VALUES (7, 70000, 1);

输出

工号|工资|部门编号|排名
4|90000|1|1
1|85000|1|2
6|85000|1|2
7|70000|1|3
2|80000|2|1
5|69000|2|2
3|60000|2|3
加载中...