This article深入探讨了这个问题,下面我将引用其中的代码:(注:见底部2个Oracle的解决方案)
解决方案 1: 这条用于查找第 N 高薪的 SQL 应该适用于 SQL Server、MySQL、DB2、Oracle、Teradata 和几乎任何其他 RDBMS:(注意:由于子查询导致性能低下)
SELECT * /*This is the outer query part */
FROM Employee Emp1
WHERE (N-1) = ( /* Subquery starts here */
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)
在上面的查询中要理解的最重要的事情是,每次外部查询处理一行时都会评估子查询。换句话说,内部查询不能独立于外部查询处理,因为内部查询也使用 Emp1 值。
为了找到第 N 个最高的薪水,我们只需要找到恰好比自己大 N-1 的薪水。
解决方案 2: 在 SQL Server 中使用 TOP 关键字查找第 n 个最高薪水
SELECT TOP 1 Salary
FROM (
SELECT DISTINCT TOP N Salary
FROM Employee
ORDER BY Salary DESC
) AS Emp
ORDER BY Salary
解决方案3:在不使用TOP的情况下,在SQL Server中找到第n个最高薪水
SELECT Salary FROM Employee
ORDER BY Salary DESC OFFSET N-1 ROW(S)
FETCH FIRST ROW ONLY
请注意,我没有亲自测试过上面的 SQL,我相信它只会在 SQL Server 2012 及更高版本中工作。
解决方案 4:在 MySQL 中工作
SELECT Salary FROM Employee
ORDER BY Salary DESC LIMIT n-1,1
LIMIT 子句在该查询中接受两个参数——第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数。
解决方案 5: 在 Oracle 中工作
select * from (
select Emp.*,
row_number() over (order by Salary DESC) rownumb
from Employee Emp
)
where rownumb = n; /*n is nth highest salary*/
解决方案 6: 以 Oracle 方式 2 工作
select * FROM (
select EmployeeID, Salary
,rank() over (order by Salary DESC) ranking
from Employee
)
WHERE ranking = N;