气死爷了,一道题做了这么久。
经典的topn问题,编写一个 SQL 查询,找出每个部门获得前三高工资的所有员工。
就是又分组又排序,而且不是找前三个人,而是找前三个工资所对应的人,不一定每个部门只有三个人。
(ps觉得leetcode写代码界面没有牛客那么友好但是题解部分很棒哈哈!)
第一种思路的话虽然不知道是版本问题还是什么,又分组又排序我们可以想到著名的窗口函数,求出每个工资所对应的排名,然后即可,这里的应该是对应用dense_rank,然后求出ranking<3再join取出部门名称就可以,具体能不能行没有试成功过所以就不写具体代码了!
第二种思路的话工资前三也就是说,超过我的工资不超过三个,所以用了一表复用,要注意这里加过滤条件就是部门相同,起到了对应部门排序的作用。
SELECT Department, Employee, Salary
FROM
(SELECT d.Name as Department,
e1.Name as Employee,
e1.Salary as Salary,
(SELECT COUNT(DISTINCT Salary)
FROM Employee e2
WHERE e2.Salary > e1.Salary
AND e1.DepartmentId = e2.DepartmentId
) AS num
FROM Employee e1
INNER JOIN Department AS d
ON e1.DepartmentId = d.Id
) AS t
WHERE num < 3
ORDER BY Department, Salary DESC