部门前三薪水的员工
表: 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查询,找出每个部门中 收入高的员工 。
以 任意顺序 返回结果表。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/department-top-three-salaries
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Mysql 解法
SELECT
b.NAME Department,
a.NAME Employee,
salary
FROM
( SELECT NAME, departmentId, salary, dense_rank() over ( PARTITION BY departmentId ORDER BY salary DESC ) rn FROM Employee ) a,
# dense_rank 开窗函数 根据部门 分组 排序 薪水 取前三
Department b
WHERE
a.departmentId = b.id
AND rn <= 3
ORDER BY
salary DESC
变量解法:
SELECT
d.name as Department,
t.Employee,
t.salary
FROM Department d
JOIN
(
SELECT
DepartmentId,
name as Employee,
Salary,
@rk:=(@pre_id<>DepartmentId)+
(@pre_id=(@pre_id:=DepartmentId))*
(@rk+(@pre_salary<>(@pre_salary:=Salary))) as rk
from Employee,(SELECT @pre_id:=0,@pre_salary:=0,@rk:=0)as v
order by DepartmentId,Salary desc
)as t
ON d.id=t.DepartmentId
WHERE rk<=3