力扣185(MySQL)-部门工资前三高的所有员工(困难)
题目:
表: Employee

表: Department

公司的主管们感兴趣的是公司每个部门中谁赚的钱最多。一个部门的 高收入者 是指一个员工的工资在该部门的 不同 工资中 排名前三 。
编写一个SQL查询,找出每个部门中 收入高的员工 。
以 任意顺序 返回结果表。
查询结果格式如下所示

输出:

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/department-top-three-salaries
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
方法一:窗口函数dense_rank()、内连接join、between...and
①先将employee表按部门号进行分组,按salary进行降序排序。
1 SELECT name, salary, departmentId, dense_rank ( ) over ( PARTITION BY departmentId ORDER BY salary DESC ) AS rnk
2 FROM employee

②再将第一步查询出来的临时表与depatment表通过部门id联结起来,然后筛选出排序数字在1-3的行数据。
1 SELECT
2 b.name as department,
3 a.name as employee,
4 salary
5 FROM
6 ( SELECT name, salary, departmentId, dense_rank ( )over ( PARTITION BY departmentId ORDER BY salary DESC ) AS rnk
7 FROM employee ) as a
8 JOIN department b
9 ON a.departmentId = b.id
10 WHERE a.rnk between 1 AND 3;
#between and可以替换成 a.rnk <= 3


方法二:先找出前三大的薪水,从e2表里寻找在相同部门中比自身e1表更高的工资值,只需要找比当前工资大0,1,2个的,这样自己排第三就刚好第三高薪资。然后把表 Department 和表 Employee 连接,获得各个部门工资前三高的员工
1 SELECT
2 department.name AS department,
3 e1.name AS employee,
4 e1.salary AS salary
5 FROM
6 employee e1,department
7 WHERE
8 e1.departmentId = department.id
9 AND (
10 SELECT count( DISTINCT e2.salary )
11 FROM employee e2
12 WHERE e1.salary < e2.salary
13 AND e1.departmentId = e2.departmentId
14 ) < 3
15 ORDER BY
16 department.name,
17 e1.salary DESC;

小知识:
①窗口函数:dense_rank() over(partition by 分组字段 order by 排序字段):排序序号连续:1,2,2,3...
力扣185(MySQL)-部门工资前三高的所有员工(困难)的更多相关文章
- 185. 部门工资前三高的所有员工 + 多表联合 + join + dense_rank()
185. 部门工资前三高的所有员工 LeetCode_MySql_185 题目描述 方法一:使用join on # Write your MySQL query statement below sel ...
- 部门工资前三高的所有员工 - LeetCode
Employee 表包含所有员工信息,每个员工有其对应的工号 Id,姓名 Name,工资 Salary 和部门编号 DepartmentId . +----+-------+--------+---- ...
- Leetcode的SQL题解:185. 部门工资前三高的员工
题目 查询部门工资前三高的员工. 我用的数据库是oracle. 下面是数据表的信息. Employee表数据: | ID | NAME | Salary | DepartmentId | | -- | ...
- [SQL]LeetCode185. 部门工资前三高的员工 | Department Top Three Salaries
SQL 架构 Create table If Not Exists Employee (Id ), Salary int, DepartmentId int) Create table If Not ...
- sql查询:部门工资前三高的员工和部门工资最高的员工
创建表:Create table If Not Exists Employee (Id int, Name varchar(255), Salary int, DepartmentId int);Cr ...
- SQL查询每个部门工资前三名的员工信息
--通用sql select deptno, ename, sal from emp e1 where ( ) from emp e2 where e2.deptno=e1.deptno and e2 ...
- mysql查询每个部门/班级前几名
Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id . +----+-------+--------+--------------+ | I ...
- mysql查询之部门工资最高的员工
最近发现一个网站 力扣 查看 上面有很多算法和数据库的题目,做了一下,发现自己平时都疏忽了,因此边做边记录下来 Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 de ...
- LeetCode:184.部门工资最高的员工
题目链接:https://leetcode-cn.com/problems/department-highest-salary/ 题目 Employee 表包含所有员工信息,每个员工有其对应的 Id, ...
- [SQL]LeetCode184. 部门工资最高的员工 | Department Highest Salary
The Employee table holds all employees. Every employee has an Id, a salary, and there is also a colu ...
随机推荐
- C++实现一个线程安全的map
本文是使用ChatCPT生成的,最终的代码使用起来没问题.代码是通过两轮对话完善的,后面把对话合并后跑不出理想效果就没尝试了. 第一轮对话 请求 c++11实现一个线程安全的map,使用方法与std: ...
- Navicat Premium15 解决只能显示前1000条记录问题
Navicat Premium15 解决只能显示前1000条记录问题 最近使用Navicat Premium15图形化界面操作MySQL的数据库,发现在超过1461条记录的表里,只能显示前1000条, ...
- Kotlin学习快速入门(10)—— 重载运算符使用
原文:Kotlin学习快速入门(10)-- 重载运算符使用 - Stars-One的杂货小窝 Kotlin中提供了基础的运算符,但是只是针对基础的数据类型,如Int,Double等 如果我们想让两个对 ...
- 喜讯!瑞云科技被授予“海上扬帆”5G融合应用专委会成员单位
2022年7月19日,5G应用"海上扬帆"行动计划云启航大会暨"海上扬帆"融合应用专委会成立大会在沪成功举办. 受上海信通院工创中心邀请和信任,深圳市瑞云科技有 ...
- TagProvider 与 Enricher 丰富日志
TagProvider [LogProperties] 与 [LogPropertyIgnore] 如果用在DTO不存在任何问题,如果用在Domain实体上,可能有点混乱. 您可能不希望因日志记录问 ...
- java基础的项目
334,零钱通 思路: (1) 先完成显示菜单,并可以选择菜单,给出对应提示 (2) 完成零钱通明细,简单的话可以使用String拼接 (3)完成收益入账 完成功能驱动程序员增加新的变化和代码 ( ...
- management.endpoints.web.exposure.include
yml配置文件中 management: endpoints: web: exposure: include: '*' properties配置文件中 management.endpoints.web ...
- vue项目,关闭eslint语法检测
vue.config.js文件中 module.exports = { lintOnSave:false //关闭语法检查 } 然后重启项目生效!
- Non-local Network:人类早期在CV驯服Transformer尝试 | CVPR 2018
Non-local操作是早期self-attention在视觉任务上的尝试,核心在于依照相似度加权其它特征对当前特征进行增强,实现方式十分简洁,为后续的很多相关研究提供了参考 来源:晓飞的算法工程 ...
- KingbaseES V8R6 等待事件之IO类BufFileRead BufFileWrite
等待事件含义 当数据库创建临时文件时,会发生IO:BufFileRead和IO:BufFileWrite等待事件.当操作需要的内存比当前定义的work_mem内存参数更多时,会将临时数据写入磁盘永久存 ...