题目描述
(通过次数102,141 | 提交次数195,659,通过率52.20%)
表:Employee +--------------+---------+ | Column Name | Type | +--------------+---------+ | id | int | | name | varchar | | salary | int | | departmentId | int | +--------------+---------+ Id是该表的主键列。 departmentId是Department表中ID的外键。 该表的每一行都表示员工的ID、姓名和工资。它还包含了他们部门的ID。 表:Department +-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | name | varchar | +-------------+---------+ Id是该表的主键列。 该表的每一行表示部门ID和部门名。 公司的主管们感兴趣的是公司每个部门中谁赚的钱最多。一个部门的 高收入者 是指一个员工的工资在该部门的 不同 工资中 排名前三 。 编写一个SQL查询,找出每个部门中 收入高的员工 。 以 任意顺序 返回结果表。 查询结果格式如下所示。 示例 1: 输入: Employee 表: +----+-------+--------+--------------+ | id | name | salary | departmentId | +----+-------+--------+--------------+ | 1 | Joe | 85000 | 1 | | 2 | Henry | 80000 | 2 | | 3 | Sam | 60000 | 2 | | 4 | Max | 90000 | 1 | | 5 | Janet | 69000 | 1 | | 6 | Randy | 85000 | 1 | | 7 | Will | 70000 | 1 | +----+-------+--------+--------------+ Department 表: +----+-------+ | id | name | +----+-------+ | 1 | IT | | 2 | Sales | +----+-------+ 输出: +------------+----------+--------+ | Department | Employee | Salary | +------------+----------+--------+ | IT | Max | 90000 | | IT | Joe | 85000 | | IT | Randy | 85000 | | IT | Will | 70000 | | Sales | Henry | 80000 | | Sales | Sam | 60000 | +------------+----------+--------+ 解释: 在IT部门: - Max的工资最高 - 兰迪和乔都赚取第二高的独特的薪水 - 威尔的薪水是第三高的 在销售部: - 亨利的工资最高 - 山姆的薪水第二高 - 没有第三高的工资,因为只有两名员工 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/department-top-three-salaries
//测试数据 Create table If Not Exists Employee (id int, name varchar(255), salary int, departmentId int); Create table If Not Exists Department (id int, name varchar(255)); insert into Employee (id, name, salary, departmentId) values ('1', 'Joe', '85000', '1'); insert into Employee (id, name, salary, departmentId) values ('2', 'Henry', '80000', '2'); insert into Employee (id, name, salary, departmentId) values ('3', 'Sam', '60000', '2'); insert into Employee (id, name, salary, departmentId) values ('4', 'Max', '90000', '1'); insert into Employee (id, name, salary, departmentId) values ('5', 'Janet', '69000', '1'); insert into Employee (id, name, salary, departmentId) values ('6', 'Randy', '85000', '1'); insert into Employee (id, name, salary, departmentId) values ('7', 'Will', '70000', '1'); insert into Department (id, name) values ('1', 'IT'); insert into Department (id, name) values ('2', 'Sales');
解题思路
周末了,来道简单题。即使官方标注这是道困难题。
根据题目要求:取出每个部门赚钱最多的前3个人,也就是工资排名前3的人。如果工资相同,则作为并列名次返回。
那么,很明显,按部门开窗排名,是最直观的实现方式。而开窗函数有3个:
* **row_number**:为每一行返回一个唯一的数字,排名相等则按随机顺序返回排名。
* **rank**:排名相等的情况下返回相同的排名,但排名结果会有断档。
* **dense_rank**:排名相等的情况下返回相同的排名,但排名结果不会有断档。
所以,根据开窗函数的特点,dense_rank是最合适的。
参考SQL
未特别说明的情况下,参考SQL为基于MySQL8.0实现。
select c.name as Department, b.Employee, b.salary from ( select a.name as Employee, a.salary, a.departmentId, dense_rank() over(partition by a.departmentId order by a.salary desc) rk from Employee a )b left join Department c on b.departmentId = c.id where b.rk <= 3;
本站所有内容均为原创,本站保留所有权利。仅允许非商业用途的转载,但必须注明来源网站、作者、来源链接!否则,由此造成的一切后果,由转载方承担!
干货分享、技术提升、面试笔试、学习交流,欢迎关注公众号:xuesql。QQ学习交流群:209942678。