sql - 当表有重复的薪水时,使用子查询和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
初始表数据:
谁能告诉我哪种方法是正确的以及为什么?
解决方案
DENSE_RANK()
不做你想做的事。它分配递增的数字,同时为 ties 赋予相同的等级。因此,可能有超过 6 条记录的薪水高于排名第 7 的记录。
另一个查询为您提供了正确的结果,但可以使用OFFSET/FETCH
语法进行简化,该语法自 2012 版起在 SQL Server 中可用:
select * from employee order by salary offset 6 rows fetch next 1 row only
推荐阅读
- mysql - 使用联合时,MySql 查询不排序记录
- c# - “IConfiguration”不包含“GetSection”的定义
- git - 有没有办法在gitlab中自动合并分支?
- spring-boot - Spring在POST上启动多对多重复密钥问题,而不是在PUT上
- ajax - 如果我只使用 fetch() 函数来发送数据,是否需要使用 then() 函数?
- python - 使用匹配的 Multiindex 值访问 pandas 数据帧的行
- python-3.x - 如何使用 Telethon 更改我的电报帐户名称?
- asciidoc - Asciidoctor 中的 pygments 未显示行号
- c++ - 在 OpenCV C++ 中复制 MATLAB 代码(bwConnComp 和 regionprops)
- react-native - react-native-reanimated 和 react-native-stack 是如何连接的?