LeetCode(数据库)- 部门工资前三高的所有员工

简介: LeetCode(数据库)- 部门工资前三高的所有员工

题目链接:点击打开链接

 

题目大意:略。

 

解题思路:

  • 解决方案(1):因为题目说最多 3 个,所以从最里面的子查询到最外面子查询开始,分别获取 MAX 薪水并且要排除掉上一次最高的薪水,这样从里到外子查询薪水依次排名:1、2、3名次;结尾只要包含其中一列的 S* 说明就在这排名范围内。这里尤其注意 GROUP BY 的时候,一定要对最里面的子查询的部门 Id 进行分组,因为很有可能,只有一条记录,根本没排名 2、3,这样的话对当前子查询进行部门 Id 分组的话,此时该部门 Id 为 null,就会出问题。
  • 解决方案(2):在解决方案(1)的基础上,里面 3 个子查询走完其实长这样的,如图所示(当然这里的 S3/D3 为 null 是因为我的案例只有最多到排名 2 就结束了)

image.png

其实到这里可以转成 S/D 两列,这样的话到时候外围 SELECT 只要用 IN 语法就可以大功告成了,但是这里目前只想到 UNION ALL 语法进行拼接,而且很麻烦,效率低,因为要对 3 个子查询进行每次的 UNION ALL,所以这里不推荐,但是这个思路还是可以跟大伙分析下哈~

  • 解决方案(3):根据 部门 (升)薪水 (降) 顺序查询出每个部门的员工薪水进行排序,注意这里的 CASE WHEN THEN 语法后面虽然没BREAK 但是默认有该作用,所以哪怕第一个 WHEN 通过后,也不会走第二个 WHEN
  • 解决方案(4):公司里前 3 高的薪水意味着有不超过 3 个工资比这些值大


AC 代码

  • 解决方案(1)
SELECTde. NAMEDepartment, em. NAMEEmployee, em.SalaryFROMEmployeeemJOINDepartmentdeONem.DepartmentId=de.Id,
 (
SELECTMAX(Salary) S3, S2, S1, DFROMEmployeee1RIGHTJOIN (
SELECTMAX(Salary) S2, S1, DFROMEmployeee0RIGHTJOIN (
SELECTMAX(Salary) S1, DepartmentIdDFROMEmployeeGROUPBYDepartmentId        ) rs1ONe0.DepartmentId=rs1.DANDe0.Salary<>rs1.S1GROUPBYD    ) rs2ONe1.DepartmentId=rs2.DANDe1.Salary<>rs2.S1ANDe1.Salary<>rs2.S2GROUPBYD) rs3WHEREde.Id=rs3.DAND (em.Salary=rs3.S1ORem.Salary=rs3.S2ORem.Salary=rs3.S3)
  • 解决方案(2)
UNIONALL
  • 解决方案(3)
SELECTdep.NameDepartment, emp.NameEmployee, emp.SalaryFROM (
SELECTte.DepartmentId, te.Salary,
CASEWHEN@pre=DepartmentIdTHEN@rank:=@rank+1WHEN@pre :=DepartmentIdTHEN@rank:=1ENDAS`RANK`FROM (SELECT@pre:=null, @rank:=0) tt,
             (
SELECTDepartmentId,SalaryFROMEmployeeGROUPBYDepartmentId,SalaryORDERBYDepartmentId,SalaryDESC             ) te       ) tINNERJOINDepartmentdepONt.DepartmentId=dep.IdINNERJOINEmployeeempONt.DepartmentId=emp.DepartmentIdandt.Salary=emp.Salaryandt.RANK<=3
  • 解决方案(4)
SELECTd.NameAS'Department', e1.NameAS'Employee', e1.SalaryFROMEmployeee1JOINDepartmentdONe1.DepartmentId=d.IdWHERE3> (SELECTCOUNT(DISTINCTe2.Salary)
FROMEmployeee2WHEREe2.Salary>e1.SalaryANDe1.DepartmentId=e2.DepartmentId        )
;
目录
相关文章
|
6月前
|
SQL
leetcode-SQL-1741. 查找每个员工花费的总时间
leetcode-SQL-1741. 查找每个员工花费的总时间
64 0
|
5月前
|
SQL 存储 移动开发
力扣第185题:部门工资前三高的员工
力扣第185题:部门工资前三高的员工
|
5月前
|
SQL 算法 大数据
深入解析力扣184题:部门工资最高的员工(子查询与窗口函数详解)
深入解析力扣184题:部门工资最高的员工(子查询与窗口函数详解)
|
6月前
|
SQL
leetcode-SQL-181. 超过经理收入的员工
leetcode-SQL-181. 超过经理收入的员工
42 0
|
5月前
|
SQL 算法 大数据
深入解析力扣181题:超过经理收入的员工(自连接方法详解及模拟面试问答)
深入解析力扣181题:超过经理收入的员工(自连接方法详解及模拟面试问答)
|
6月前
|
关系型数据库 MySQL 数据库
MySQL员工打卡日志表——数据库练习
MySQL员工打卡日志表——数据库练习
188 0
|
6月前
|
SQL
leetcode-SQL-1731. 每位经理的下属员工数量
leetcode-SQL-1731. 每位经理的下属员工数量
46 0
|
6月前
|
SQL
leetcode-SQL-184. 部门工资最高的员工
leetcode-SQL-184. 部门工资最高的员工
28 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
114 2