001-LeetCode数据库刷题笔记【184】

个人力扣数据库刷题总结,供学习参考,欢迎各位指正


一、题目描述

表Employee

+--------------+---------+
| 列名          | 类型    |
+--------------+---------+
| id           | int     |
| name         | varchar |
| salary       | int     |
| departmentId | int     |
+--------------+---------+

在 SQL 中,id是此表的主键。
departmentId 是 Department 表中 id 的外键(在 Pandas 中称为 join key)。
此表的每一行都表示员工的 id、姓名和工资。它还包含他们所在部门的 id。

 表Department

+-------------+---------+
| 列名         | 类型    |
+-------------+---------+
| id          | int     |
| name        | varchar |
+-------------+---------+

在 SQL 中,id 是此表的主键列。
此表的每一行都表示一个部门的 id 及其名称。

Q:查找出每个部门中薪资最高的员工,按 任意顺序 返回结果表。


答案示例:

输入:

Employee表

+----+-------+--------+--------------+
| id | name  | salary | departmentId |
+----+-------+--------+--------------+
| 1  | Joe   | 70000  | 1            |
| 2  | Jim   | 90000  | 1            |
| 3  | Henry | 80000  | 2            |
| 4  | Sam   | 60000  | 2            |
| 5  | Max   | 90000  | 1            |
+----+-------+--------+--------------+

Department表

+----+-------+
| id | name  |
+----+-------+
| 1  | IT    |
| 2  | Sales |
+----+-------+

输出:

+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT         | Jim      | 90000  |
| Sales      | Henry    | 80000  |
| IT         | Max      | 90000  |
+------------+----------+--------+

解释:Max 和 Jim 在 IT 部门的工资都是最高的,Henry 在销售部的工资最高

二、解题思路

题目描述提取部门工资最高的员工,可以用rank窗口函数降序排序,排名第一即为工资最高的员工(包括了并列第一的情况),其次有两个部门,可以用partition by进行员工的划分。

那首先先把员工和对应的部门,按工资降序排名给打出来:

select Department.name as Department
      ,Employee.name as Employee
      ,salary as Salary
      ,rank() over(partition by departmentId order by salary desc)as rk
from Employee
left join Department
on Employee.departmentId = Department.id

需要打印的是部门名、员工名、薪资和排名

排名采用的是窗口函数,将员工根据departmentId进行划分,划分后的每个部门按照薪资降序进行排序

Employee表需要与Department表进行左外连接,这样才可以通过Employee的departmentId获取Department中的部门名称

打印结果如下:

| Department | Employee | Salary | rk |
| ---------- | -------- | ------ | -- |
| IT         | Jim      | 90000  | 1  |
| IT         | Max      | 90000  | 1  |
| IT         | Joe      | 70000  | 3  |
| Sales      | Henry    | 80000  | 1  |
| Sales      | Sam      | 60000  | 2  |

通过上面打印的结果,我们得到了每个部门的员工薪资排名,那我们只需要把这个表作为临时表,在此基础上筛选出排名第一的员工就可以啦~

完整代码如下:

select Department
      ,Employee
      ,Salary
from(
      select Department.name as Department
            ,Employee.name as Employee
            ,salary as Salary
            ,rank() over(partition by departmentId order by salary desc)as rk
      from Employee
      left join Department
      on Employee.departmentId = Department.id
      ) as temp
WHERE rk =1;

 结果如下:

| Department | Employee | Salary |
| ---------- | -------- | ------ |
| IT         | Jim      | 90000  |
| IT         | Max      | 90000  |
| Sales      | Henry    | 80000  |

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值