Leetcode困难之185.部门工资前三高的所有员工

表: 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.com/problems/department-top-three-salaries
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答

法一:窗口函数(dense_rank)

select d.name Department, t.Employee,t.Salary 
from
    (select 
    	departmentId,name Employee,salary Salary,
        dense_rank() over(partition by departmentId order by salary desc) drk
     from employee) 
t
join 
department d on t.departmentId=d.id
where 
	t.drk<=3

法二:join和子查询

思路:首先,找出公司里前 3 高的薪水,意思是不超过三个值比这些值大;
然后,再连接表 Department 和表 Employee

select 
    d.name Department,e1.name Employee,e1.salary Salary
from 
    employee e1
        join 
    department d on e1.departmentId = d.id
where 3> 
(       select 
            count(distinct salary)
        from 
            employee e2
        where 
            e2.salary > e1.salary
            and e1.departmentId = e2.departmentId
)
order by 
    Department,Salary desc

你可能感兴趣的:(leetcode刷题,MySQL,数据分析师,mysql)