题目大意:
部门工资前三高的员工
Employee
表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id 。
+----+-------+--------+--------------+ | Id | Name | Salary | DepartmentId | +----+-------+--------+--------------+ | 1 | Joe | 70000 | 1 | | 2 | Henry | 80000 | 2 | | 3 | Sam | 60000 | 2 | | 4 | Max | 90000 | 1 | | 5 | Janet | 69000 | 1 | | 6 | Randy | 85000 | 1 | +----+-------+--------+--------------+
Department
表包含公司所有部门的信息。
+----+----------+ | Id | Name | +----+----------+ | 1 | IT | | 2 | Sales | +----+----------+
编写一个 SQL 查询,找出每个部门工资前三高的员工。例如,根据上述给定的表格,查询结果应返回:
+------------+----------+--------+ | Department | Employee | Salary | +------------+----------+--------+ | IT | Max | 90000 | | IT | Randy | 85000 | | IT | Joe | 70000 | | Sales | Henry | 80000 | | Sales | Sam | 60000 | +------------+----------+--------+
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=185
思路分析:
这道题用程序代码来做应该是很简单的,但题目偏偏要我们使用SQL解决问题。我首先想到的方法是分别取得所有部门前三高收入的人,然后再把结果union到一起。不过这种方法要先select出所有部门,之后再循环取数据,无论写法还是效率应该都不高,所以采用了下面这种思路。
题目要求我们查找出所有部门的前三名首富,也就是说,我们只要找出所有当前部门中比自己工资高的人不超过2名的员工即可。换句话说,就是找出当前部门的首富,工资第二高的人以及工资第三高的人。
关键的SQL如下:
SELECT A.Salary FROM Employee A WHERE (SELECT count(distinct C.Salary) from Employee C where C.Salary > A.Salary and C.DepartmentId = A.DepartmentId ) < 3
最后再根据题意的要求稍加整理便是最后的答案
SELECT B.Name as Department, A.Name as Employee, A.Salary FROM Employee A JOIN Department B ON A.DepartmentId = B.Id WHERE (SELECT count(distinct C.Salary) from Employee C where C.Salary > A.Salary and C.DepartmentId = A.DepartmentId ) < 3 Order by Department, A.Salary DESC本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-185-department-top-three-salaries思路分析及sql文分享/