首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于从工资表中查找第N个最高工资的SQL查询

用于从工资表中查找第N个最高工资的SQL查询
EN

Stack Overflow用户
提问于 2010-10-03 21:58:48
回答 11查看 59.2K关注 0票数 25

如何在SQL Server中查找包含薪资的表中的第N个最高薪资?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2010-10-03 22:05:09

您可以使用公用表表达式(CTE)来派生答案。

假设您的薪水表中包含以下薪水:

代码语言:javascript
复制
 EmployeeID  Salary
--------------------
     10101   50,000
     90140   35,000
     90151   72,000
     18010   39,000
     92389   80,000

我们将使用:

代码语言:javascript
复制
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

这将为按薪水降序排序后的每一行创建一个行号,然后检索第三行(其中包含第三高的记录)。

  • SQL Fiddle

对于那些不想要CTE (或困在SQL2000中)的人:

注释:这比上面的示例性能要差得多;将它们与执行计划并排运行时,CTE的查询开销为36%,子查询的查询开销为64%

代码语言:javascript
复制
SELECT TOP 1 Salary
FROM 
(
    SELECT TOP N Salary
    FROM Salaries
    ORDER BY Salary DESC
) SalarySubquery
ORDER BY Salary ASC

其中N由您定义。

SalarySubquery是我为子查询或括号中的查询指定的别名。

子查询所做的是选择前N个薪水(在本例中我们将称之为3 ),并按最高的薪水排序。

如果我们想看到第三高的薪水,子查询将返回:

代码语言:javascript
复制
 Salary
-----------
80,000
72,000
50,000

然后,外部查询从子查询中选择第一个工资,除非我们这次对它进行升序排序,从最小到最大进行排序,因此50,000将是升序排序的第一条记录。

如您所见,50,000确实是示例中第三高的薪水。

票数 34
EN

Stack Overflow用户

发布于 2010-10-03 22:08:53

您可以使用row_number选择特定的行。例如,排名第42位的最高工资:

代码语言:javascript
复制
select  *
from    (
        select  row_number() over (order by Salary desc) as rn
        ,       *
        from    YourTable
        ) as Subquery
where   rn = 42

row_number这样的窗口函数只能出现在selectorder by子句中。解决方法是将row_number放入子查询中。

票数 12
EN

Stack Overflow用户

发布于 2011-04-07 21:10:27

代码语言:javascript
复制
select MIN(salary) from (
select top 5 salary from employees order by salary desc) x
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3850034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档