185. 部门工资前三高的所有员工(重要)

气死爷了,一道题做了这么久。

经典的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

你可能感兴趣的:(SQL学习)