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

题目描述:在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,那么当前工资肯定在当前部门排不进前三了,自然不符合要求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穿条秋裤到处跑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值