如何在SQL Server中查找包含薪资的表中的第N个最高薪资?
发布于 2010-10-03 22:05:09
您可以使用公用表表达式(CTE)来派生答案。
假设您的薪水表中包含以下薪水:
EmployeeID Salary
--------------------
10101 50,000
90140 35,000
90151 72,000
18010 39,000
92389 80,000我们将使用:
DECLARE @N int
SET @N = 3 -- Change the value here to pick a different salary rank
SELECT Salary
FROM (
SELECT row_number() OVER (ORDER BY Salary DESC) as SalaryRank, Salary
FROM Salaries
) as SalaryCTE
WHERE SalaryRank = @N这将为按薪水降序排序后的每一行创建一个行号,然后检索第三行(其中包含第三高的记录)。
对于那些不想要CTE (或困在SQL2000中)的人:
注释:这比上面的示例性能要差得多;将它们与执行计划并排运行时,CTE的查询开销为36%,子查询的查询开销为64%
SELECT TOP 1 Salary
FROM
(
SELECT TOP N Salary
FROM Salaries
ORDER BY Salary DESC
) SalarySubquery
ORDER BY Salary ASC其中N由您定义。
SalarySubquery是我为子查询或括号中的查询指定的别名。
子查询所做的是选择前N个薪水(在本例中我们将称之为3 ),并按最高的薪水排序。
如果我们想看到第三高的薪水,子查询将返回:
Salary
-----------
80,000
72,000
50,000然后,外部查询从子查询中选择第一个工资,除非我们这次对它进行升序排序,从最小到最大进行排序,因此50,000将是升序排序的第一条记录。
如您所见,50,000确实是示例中第三高的薪水。
发布于 2010-10-03 22:08:53
您可以使用row_number选择特定的行。例如,排名第42位的最高工资:
select *
from (
select row_number() over (order by Salary desc) as rn
, *
from YourTable
) as Subquery
where rn = 42像row_number这样的窗口函数只能出现在select或order by子句中。解决方法是将row_number放入子查询中。
发布于 2011-04-07 21:10:27
select MIN(salary) from (
select top 5 salary from employees order by salary desc) xhttps://stackoverflow.com/questions/3850034
复制相似问题