我想在员工表中找到第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在这里是如何运作的。我真的很惊讶看到这个查询,它也运行良好。我真的想知道这个查询中的技巧。
任何人都可以帮我理解这个问题吗?
提前致谢!
答案 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中获得相同的结果,其中一些方法效率不高,您最好避免使用它们。添加了窗口聚合函数,因为对排序,累积或移动总和等查询的处理效率非常低。