leetcode 185. Department Top Three Salaries思路分析及SQL文分享

题目大意:

部门工资前三高的员工

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
本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/leetcode-185-department-top-three-salaries思路分析及sql文分享/
此条目发表在leetcode分类目录,贴了, , 标签。将固定链接加入收藏夹。

发表评论

您的电子邮箱地址不会被公开。