3

データが次のようなテーブルがあります。

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

cte;を使用して 2 番目に高い給与を見つけることができます。

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

しかし、これは 'Ram' という結果になり、給与は 20000 になります。返してほしいのは、給与ランキングが 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 に答える
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 に答える
1

次のように CO-RELATED クエリを使用して、2 番目に高い給与を取得できます。

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 に答える
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

では、給与で 3 番目に高い人 (2 人が 15,000 の給与を分け合う可能性があるため、常に同じであるとは限りません) と、3 番目に高い給与を持つ人 (この場合は14,000 の給与を持っているのは 1 人だけですが、それは保証ではありません。

于 2013-08-26T18:12:02.120 に答える