在sql中找到第n个最高薪水

时间:2016-03-02 15:00:18

标签: sql oracle oracle11g

我想在员工表中找到第n个最高薪水。我使用一个查询获得了我的结果,但我从Google获得了一个查询,并且真的想要了解该查询中使用的概念。

SELECT * FROM EMPLOYEE e1
WHERE N-1 = 
           (SELECT COUNT(e2.ORIG_SALARY) FROM EMPLOYEE e2
                  WHERE e2.ORIG_SALARY > e1.ORIG_SALARY)

我真的想知道N在这里是如何运作的。我真的很惊讶看到这个查询,它也运行良好。我真的想知道这个查询中的技巧。

任何人都可以帮我理解这个问题吗?

提前致谢!

2 个答案:

答案 0 :(得分:0)

SELECT * FROM EMPLOYEE e1
WHERE N-1 = 
           (SELECT COUNT(e2.ORIG_SALARY) FROM EMPLOYEE e2
                  WHERE e2.ORIG_SALARY > e1.ORIG_SALARY)

COUNT(e2.ORIG_SALARY)在返回的数据集中输出此列中的条目数量。数据集的所有工资都高于主查询返回行中的工资。

WHERE N-1 =表示它将获得该计数与N-1

匹配的结果

这意味着您将获得表格员工的一行,其中表格中的工资增加N-1,从而有效地为您提供第n个最高工资的行。

但请记住,这并不完美。例如,如果你有多个人在前6名中拥有相同的工资,你就得不到第n个最高工资,你得到的第n个最高工资按工资降序排列。

答案 1 :(得分:-1)

只需使用DENSE_RANK(希望这是您提到的那个):

SELECT * 
FROM
 (
    SELECT e.*,
       DENSE_RANK() OVER (ORDER BY e1.ORIG_SALARY DESC) AS rnk
    FROM EMPLOYEE e
 )
WHERE rnk = n

总有多种方法可以在SQL中获得相同的结果,其中一些方法效率不高,您最好避免使用它们。添加了窗口聚合函数,因为对排序,累积或移动总和等查询的处理效率非常低。