首页 > 解决方案 > 当表有重复的薪水时,使用子查询和dense_rank的第n个最高薪水不匹配

问题描述

我试图使用子查询和dense_rank 方法从表中获得第n 高的薪水。以下是每种方法的结果。

子查询方法:

select Top 1 Salary 
from (
    select top 7 Salary from Employee order by Salary desc
) as Result
order by Salary

此方法返回第 7 高的薪水为:3000

Dense_Rank 方法:

select * 
from (
    select Salary, DENSE_RANK() Over(order by Salary desc) DRank 
    from Employee
) as Result 
where DRank=7

此方法返回第 7 高的薪水为:1000

初始表数据:

员工表

谁能告诉我哪种方法是正确的以及为什么?

标签: sqlsql-servertsqlsql-order-bysql-limit

解决方案


DENSE_RANK()不做你想做的事。它分配递增的数字,同时为 ties 赋予相同的等级。因此,可能有超过 6 条记录的薪水高于排名第 7 的记录。

另一个查询为您提供了正确的结果,但可以使用OFFSET/FETCH语法进行简化,该语法自 2012 版起在 SQL Server 中可用:

select * from employee order by salary offset 6 rows fetch next 1 row only

推荐阅读