sql - 当表有重复工资时,使用子查询和密集排名的第 n 个最高工资不匹配

标签 sql sql-server t-sql sql-order-by sql-limit

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

子查询方法:

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

此方法返回第七高工资:3000

Dense_Rank 方法:

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

此方法返回第七高工资:1000

初始表数据:

Employee Table

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

最佳答案

DENSE_RANK() 不执行您想要的操作。它分配递增的数字,同时给平局赋予相同的排名。因此可能有超过 6 条记录的薪资高于排名第 7 的记录。

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

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

关于sql - 当表有重复工资时,使用子查询和密集排名的第 n 个最高工资不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59668239/

相关文章:

c# - 我如何解决 NHibernate.MappingException

mysql - 在 mysql 中实现某种枢轴

c# - 使用无名参数执行存储过程

sql-server - SQL Server不同设计查询性能

sql - PIVOT 并插入每 N 行

sql-server - SSRS自定义排序一列ASC和DESC

mysql - 如何使用 group by (MySQL) 查找中值

sql - SQLite触发器优化

SQL Server 计数来自父类别和所有子类别的记录

sql - 如何根据测量之间的持续时间计算平均值?