LeetCode-185 : sql分组排序再取前几位

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_41885819/article/details/100559670

题目描述:在EMPLOYEE表中查询每个部门工资前三高的员工。

题目分析:

题目中还是已经描述的比较清楚,比如某个部门工资按从高到低排序为9000,8900,8900,8500,8000…那么该部门需要查询出的其实有四位,分别是9000,8900,8900,8500。这其实也很好理解,比如说最高的工资9000,同部门的有四个人,那么如果查询条数为3的话,该显示哪3位呢?所以,这里的工资应该去重之后再查询出前三。
如果去重查询后,某个部门的工资条数不足3,那么则应该显示该部门所有员工的信息。

解题思路:

这个问题的关键点在于根据部门,去重查询出该部门工资排名的前三高的工资。我一开始想的是根据部门,在子查询中直接查出前三高的工资,再通过当前工资与前三高的工资进行比较。
sql大概如下:

SELECT T.NAME DEPARTMENT,E.NAME EMPLOYEE,E.SALARY
FROM EMPLOYEE E
,DEPARTMENT T
WHERE 1=1 
AND E.DEPARTMENTID = T.ID
AND  SALARY IN (
	SELECT 当前部门前三高的工资(去重后)
)
ORDER BY T.ID,E.SALARY DESC,E.ID    

这个逻辑肯定是对的,但总感觉不会太高效,特别是有IN的场景,先要查出前三高的工资,再判断当前工资是否位居其列。
整理一下思路,其实可以将当前工资和当前部门加入到子查询中,查询当前部门比当前工资高的数量(去重后),这样肯定回避之前用IN高效很多,特别是数据量更大的时候。
sql如下:

SELECT T.NAME DEPARTMENT,E.NAME EMPLOYEE,E.SALARY
FROM EMPLOYEE E, DEPARTMENT T
WHERE 1=1 
AND E.DEPARTMENTID = T.ID
--只需特别关注以下约束
AND  (SELECT COUNT(DISTINCT E1.SALARY)
           FROM EMPLOYEE E1
            WHERE E.DEPARTMENTID = E1.DEPARTMENTID
            AND E.SALARY<= E1.SALARY
           )<=3
ORDER BY T.ID,E.SALARY DESC,E.ID      

我们将子查询的条件拉出来看

(SELECT COUNT(DISTINCT E1.SALARY)
           FROM EMPLOYEE E1
            WHERE E.DEPARTMENTID = E1.DEPARTMENTID
            AND E.SALARY<= E1.SALARY
           )<=3

括号内查询的是在当前部门下,比当前工资高的有多少条数据,同时也包括当前工资,如果查询出来的数字大于3,那么当前工资肯定在当前部门排不进前三了,自然不符合要求。

猜你喜欢

转载自blog.csdn.net/qq_41885819/article/details/100559670