【LeetCode-SQL高手挑战】—185. 部门工资前三高的所有员工

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【LeetCode-SQL高手挑战】—185. 部门工资前三高的所有员工

文章目录



🐴 1.SQL题目概述


LeetCode原题链接

表: 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查询,找出每个部门中 收入高的员工 。

以 任意顺序 返回结果表。

查询结果格式如下所示。

🚩查询结果如下例所示
输入: 
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的工资最高
- 兰迪和乔都赚取第二高的独特的薪水
- 威尔的薪水是第三高的
在销售部:
- 亨利的工资最高
- 山姆的薪水第二高
- 没有第三高的工资,因为只有两名员工

🐴 2.解题思路


MySQL8.0 中专门有开创窗口函数实现上述排名,但是一定使用正确的窗口函数排序

ROW_NUMBER(),DENSE_RANK(),RANK() 这三个区别哈,

这里使用DENSE_RANK(),即并列排名连续不间断

需要注意的一点是 as 后的别名,千万不要与前面的函数名重名,否则会报错

Oracle中直接有对应的开窗函数 DENSE_RANK()处理

邦德这里使用了数据库自带的开窗函数来解题,

如果小伙伴们还有其他解题思路,欢迎评论区留言交流~

image.png

🐴 3.方法实现


🌈Oracle实现

select
m.Department as “Department”,
m.Employee as “Employee”,
m.Salary as “Salary”
from
(
SELECT b.name AS “DEPARTMENT”,
a.name AS “EMPLOYEE”,
a.Salary,
DENSE_RANK() OVER(partition by a.departmentId ORDER BY a.salary desc) rank
FROM Employee a,Department b
where a.departmentId = b.id
) m where rank<=3;

🌈MySQL实现

select
m.Department,
m.Employee,
m.Salary
from (
SELECT b.name AS ‘Department’,
a.name AS ‘Employee’,
a.Salary,
DENSE_RANK() OVER w AS ‘rank’
FROM Employee a,Department b
where a.departmentId = b.id
WINDOW w AS (partition by a.departmentId ORDER BY a.salary desc)
) m where m.rank<=3;

🐴 4.代码测试


🌈Oracle实现

执行代码,开始测试

image.png

与测试结果一致,测试成功!

image.png


🌈MySQL实现

执行代码,开始测试

image.png

与测试结果一致,测试成功!

image.png


🐴 5.知识点小结


MySQL8.0 中可以利用 ROW_NUMBER(),DENSE_RANK(),RANK() 三个窗口函数实现

1.普通排名: ROW_NUMBER()

按分数高低直接排名,从 1 开始,往下排,类似于 row number

image.png

分数相同,名次相同,排名无间隔:DENSE_RANK()

image.png

另外一种排名方式是相同的值排名相同,相同值的下一个名次应该是跳跃整数值,即排名有间隔

RANK()

image.png

综上所术,我们这里选择了DENSE_RANK()来解题


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7月前
|
SQL
leetcode-SQL-1741. 查找每个员工花费的总时间
leetcode-SQL-1741. 查找每个员工花费的总时间
68 0
|
1月前
|
SQL 监控 安全
员工上网行为监控软件:SQL 在数据查询监控中的应用解析
在数字化办公环境中,员工上网行为监控软件对企业网络安全和管理至关重要。通过 SQL 查询和分析数据库中的数据,企业可以精准了解员工的上网行为,包括基础查询、复杂条件查询、数据统计与分析等,从而提高网络管理和安全防护的效率。
29 0
|
7月前
|
SQL
leetcode-SQL-181. 超过经理收入的员工
leetcode-SQL-181. 超过经理收入的员工
47 0
|
6月前
|
SQL 存储 移动开发
力扣第185题:部门工资前三高的员工
力扣第185题:部门工资前三高的员工
|
6月前
|
SQL 算法 大数据
深入解析力扣184题:部门工资最高的员工(子查询与窗口函数详解)
深入解析力扣184题:部门工资最高的员工(子查询与窗口函数详解)
|
6月前
|
SQL 算法 大数据
深入解析力扣181题:超过经理收入的员工(自连接方法详解及模拟面试问答)
深入解析力扣181题:超过经理收入的员工(自连接方法详解及模拟面试问答)
|
7月前
|
SQL
leetcode-SQL-1731. 每位经理的下属员工数量
leetcode-SQL-1731. 每位经理的下属员工数量
48 0
|
7月前
|
SQL
leetcode-SQL-184. 部门工资最高的员工
leetcode-SQL-184. 部门工资最高的员工
32 0
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
124 2
下一篇
DataWorks