我在我的博客上发布了这个:
https ://fullparam.wordpress.com/2015/03/31/sql-select-nth-rank-of-something-three-approaches/
相关子查询:
SELECT FirstName, LastName, BaseRate
FROM DimEmployee e
WHERE (SELECT COUNT(DISTINCT BaseRate)
FROM DimEmployee p WHERE e.BaseRate=p.BaseRate) = 4
为什么这是一个好答案?这不是真的,但这将适用于任何 SQL 实现。它相当慢,它会做很多查找。每次外部查询处理一行时,都会评估子查询。此查询使用密集排名并且可以返回多行。
使用 TOP 语句进行双重排序:
SELECT TOP 1 FirstName, LastName, BaseRate
FROM ( SELECT TOP 4 FirstName, LastName, BaseRate
FROM DimEmployee ORDER BY BaseRate DESC) AS MyTable
ORDER BY BaseRate ASC;
为什么这是一个好答案?因为它的语法很容易记住。让我们看一下子查询,它按降序返回 DimEmployee 表中的 N 个最高薪水。然后,外部查询将以升序(默认)顺序重新排序这些值,这意味着第 N 个最高薪水现在将是最高薪水。请记住,TOP 语句是特定于 MS SQL 服务器的。例如,MySQL 将使用 LIMIT 1。此外,此解决方案无法进行 DENSE 排名,即使两名员工共享相同的 BaseRate,也仅返回一行。
使用窗口函数:
SELECT FirstName, LastName, BaseRate
FROM (SELECT FirstName, LastName, BaseRate, DENSE_RANK() OVER (ORDER BY BaseRate DESC) Ranking
FROM DimEmployee) AS MyTable
WHERE Ranking = 4
为什么这是一个好答案?因为它表现最好——性能为王。语法也是 ANSI SQL,但在“Big 3”中只有 Oracle 和 MS 使用它。此外,您可以选择使用 ROW_NUMBER、DENSE_RANK 或常规 RANK。