Common Table Expression(CTE)を使用して、答えを導き出すことができます。
テーブルSalariesに次の給与があるとします。
EmployeeID Salary
--------------------
10101 50,000
90140 35,000
90151 72,000
18010 39,000
92389 80,000
使用します:
DECLARE @N int
SET @N = 3 -- Change the value here to pick a different salary rank
SELECT Salary
FROM (
SELECT row_number() OVER (ORDER BY Salary DESC) as SalaryRank, Salary
FROM Salaries
) as SalaryCTE
WHERE SalaryRank = @N
これにより、給与で降順で並べ替えられた後、各行の行番号が作成され、3番目の行(3番目に高いレコードが含まれます)が取得されます。
- SQLフィドル
CTEを望まない(またはSQL 2000で立ち往生している)人のために:
[注 :これは、上記の例よりも著しくパフォーマンスが低下します。それらを実行計画と並べて実行すると、CTEで36%、サブクエリで64%のクエリコストが表示されます]:
SELECT TOP 1 Salary
FROM
(
SELECT TOP N Salary
FROM Salaries
ORDER BY Salary DESC
) SalarySubquery
ORDER BY Salary ASC
ここで、Nはあなたが定義します。
SalarySubquery
サブクエリ、または括弧で囲まれたクエリに指定したエイリアスです。
サブクエリは、上位N個の給与を選択します( 3 と言います)。 この場合)、最高の給与で注文します。
3番目に高い給与を確認したい場合、サブクエリは次のように返します。
Salary
-----------
80,000
72,000
50,000
次に、外部クエリはサブクエリから最初の給与を選択します。ただし、今回は昇順で並べ替えます。これは最小から最大に並べ替えられるため、50,000が最初に昇順で並べ替えられます。
ご覧のとおり、この例では50,000が実際に3番目に高い給与です。