Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在sql中查找第n个最高薪资_Sql_Oracle_Oracle11g - Fatal编程技术网

在sql中查找第n个最高薪资

在sql中查找第n个最高薪资,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我想在员工表中找到第n个最高工资。我用一个查询得到了我的结果,但我又从谷歌得到了一个查询,我真的很想理解这个查询中使用的概念 SELECT * FROM EMPLOYEE e1 WHERE N-1 = (SELECT COUNT(e2.ORIG_SALARY) FROM EMPLOYEE e2 WHERE e2.ORIG_SALARY > e1.ORIG_SALARY) 我真的很想知道N在这里是如何运作的。看到这个查询,我真的很

我想在员工表中找到第n个最高工资。我用一个查询得到了我的结果,但我又从谷歌得到了一个查询,我真的很想理解这个查询中使用的概念

SELECT * FROM EMPLOYEE e1
WHERE N-1 = 
           (SELECT COUNT(e2.ORIG_SALARY) FROM EMPLOYEE e2
                  WHERE e2.ORIG_SALARY > e1.ORIG_SALARY)
我真的很想知道N在这里是如何运作的。看到这个查询,我真的很惊讶,它也运行得很好。我真的很想知道这个问题的诀窍

有人能帮我理解这个问题吗

提前谢谢

SELECT * FROM EMPLOYEE e1
WHERE N-1 = 
           (SELECT COUNT(e2.ORIG_SALARY) FROM EMPLOYEE e2
                  WHERE e2.ORIG_SALARY > e1.ORIG_SALARY)
COUNTe2.ORIG_SALARY在返回的数据集中输出此列中的条目数量。数据集是高于主查询返回的行中的数据集

其中N-1=表示它将在该计数与N-1匹配的情况下得到结果

这意味着您将得到表中a行的employee,其中表中有N-1个较高的工资,实际上是给您第N个最高工资的行

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

只需使用密集排名,希望这就是你提到的:

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

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

那么,您认为相关子查询的作用是什么?@jarlh,内部查询结果用作外部查询的输入。在这种情况下,如果没有外部查询,它将无法独立工作。但是N是如何在不使用订单和其他东西的情况下获得确切的工资的。你能帮我点灯吗?我很想知道!!你真的应该使用秩或密秩。当你有重复的薪水时,你的查询不会一直有效。凯特,如果我的薪水排在第五位,那就意味着4个人的薪水比我的高,也就是说5-1=4。因此,查询显示在employee中选择记录,其中4是=工资高于我们查看的记录的员工计数。那就是我。这种逻辑的缺陷在于它如何不处理关系。@Michaelbrowton,所以在这种情况下,内部查询将首先触发还是外部查询?此时问这个问题有意义吗我唯一想知道的是..如何用N来定义最高点?这可能是个愚蠢的问题。@Kate It选择的薪水高出N-1个,所以是第N个最高的。真的很简单。你没有e1别名表reference@Drew我正在复制OP中的部分代码以进行解释。它不是完整的。如果您有多个具有相同薪资的行,则此查询将不会返回第n行,它可能根本不会返回任何行。您需要在WHERE中添加一个唯一的列。要获得实际的第n个最高值,您必须切换到COUNTDISTINCT…不是DV,而是Op要求了解他们发布的查询,而不是如何进行不同的操作。@Magisch:嗯,DENSE_RANK不仅更容易理解,而且可能也更有效:-