部门前三薪水的员工

表: 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

 

posted @ 2022-07-03 23:57  春夏秋冬zz  阅读(51)  评论(0)    收藏  举报