当 table 有重复的薪水时,使用子查询的第 n 个最高薪水和 dense_rank 不匹配
nth highest salary using subquery and dense_rank doesn't match when table has duplicate salaries
我试图使用子查询和 dense_rank 方法从 table 获得第 n 高的薪水。
以下是每种方法的结果。
子查询方法:
select Top 1 Salary
from (
select top 7 Salary from Employee order by Salary desc
) as Result
order by Salary
此方法returns第7高薪为:3000
Dense_Rank方法:
select *
from (
select Salary, DENSE_RANK() Over(order by Salary desc) DRank
from Employee
) as Result
where DRank=7
此方法returns第7高薪为:1000
初始Table数据:
谁能告诉我哪种方法是正确的,为什么?
DENSE_RANK()
没有按照您的意愿进行。它分配递增的数字 ,同时给 ties 相同的排名。所以薪水高于排名第7的记录可能有6条以上
另一个查询为您提供了正确的结果,但可以通过使用 OFFSET/FETCH
语法来简化,该语法在 SQL Server 2012 版后可用:
select * from employee order by salary offset 6 rows fetch next 1 row only
我试图使用子查询和 dense_rank 方法从 table 获得第 n 高的薪水。 以下是每种方法的结果。
子查询方法:
select Top 1 Salary
from (
select top 7 Salary from Employee order by Salary desc
) as Result
order by Salary
此方法returns第7高薪为:3000
Dense_Rank方法:
select *
from (
select Salary, DENSE_RANK() Over(order by Salary desc) DRank
from Employee
) as Result
where DRank=7
此方法returns第7高薪为:1000
初始Table数据:
谁能告诉我哪种方法是正确的,为什么?
DENSE_RANK()
没有按照您的意愿进行。它分配递增的数字 ,同时给 ties 相同的排名。所以薪水高于排名第7的记录可能有6条以上
另一个查询为您提供了正确的结果,但可以通过使用 OFFSET/FETCH
语法来简化,该语法在 SQL Server 2012 版后可用:
select * from employee order by salary offset 6 rows fetch next 1 row only