3

我有一个表,其中的数据是这样的:

Name    Salary
Tom      10000
John     20000
Ram      20000
Danny    15000
Sandy    14000
Riddle   15000

我可以使用 ; 找到第二高的薪水cte

with cte
as
(
    select ROW_NUMBER() over (order by Salary desc) as r,
    * from Employee e
)
select * from cte where r=2

但这给出了具有 20000 薪水的结果“Ram”。我想要返回的是薪水排名第n的人的每条记录。例如,如果我正在寻找n=2,结果将是:

Danny    15000
Riddle   15000

如何修改查询以实现此目的?

4

5 回答 5

9

使用DENSE_RANK()

;WITH cte AS
(
    SELECT DENSE_RANK() OVER (ORDER BY Salary DESC) AS r, *
    FROM Employee e
)
SELECT *
FROM cte
WHERE r = 2

SQL小提琴

于 2013-08-26T18:01:04.530 回答
2

我在我的博客上发布了这个: 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。

于 2015-04-01T03:42:01.490 回答
1

您可以使用 CO-RELATED Query 获得第二高的薪水,如下所示:

select name from employee e1   --outer query

   where 2= --2nd highest salary

(select COUNT(e2.salary)       --inner query

from employee e2 where e2.salary >= e1.salary)
于 2014-01-14T07:14:08.133 回答
1

试试这个查询:

WITH
cte AS
(select DENSE_RANK() over (ORDER BY Salary desc) AS R, e.*
from Employee e)
SELECT * From cte
WHERE R =2

这是一个SQLFiddle

于 2013-08-26T18:09:11.010 回答
0

DISTINCT关键字可能会对您有所帮助。

SELECT Salary FROM Employee order by Salary desc

将返回

20000
20000
15000
15000
14000
10000

但添加DISTINCT

SELECT DISTINCT Salary FROM Employee order by Salary desc

将返回

20000
15000
14000
10000

那么你想要哪个,薪水第三高的人(不能保证总是相同,因为两个人可能分享 15,000 的薪水),还是薪水第三高的人(在这种情况下,是只有一个人有14000的薪水,但这并不能保证。

于 2013-08-26T18:12:02.120 回答