Aby uzyskać odpowiedź, możesz użyć wspólnego wyrażenia tabelowego (CTE).
Załóżmy, że w tabeli Wynagrodzenia masz następujące pensje:
EmployeeID Salary
--------------------
10101 50,000
90140 35,000
90151 72,000
18010 39,000
92389 80,000
Użyjemy:
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
Spowoduje to utworzenie numeru wiersza dla każdego wiersza po posortowaniu go według wynagrodzenia w kolejności malejącej, a następnie pobraniu trzeciego wiersza (zawierającego trzeci najwyższy rekord).
- Skrzypce SQL
Dla tych z Was, którzy nie chcą CTE (lub utknęli w SQL 2000):
[Uwaga :to działa zauważalnie gorzej niż w powyższym przykładzie; uruchomienie ich obok siebie z planami wykonania pokazuje koszt zapytania wynoszący 36% dla CTE i 64% dla podzapytania]:
SELECT TOP 1 Salary
FROM
(
SELECT TOP N Salary
FROM Salaries
ORDER BY Salary DESC
) SalarySubquery
ORDER BY Salary ASC
gdzie N jest zdefiniowane przez Ciebie.
SalarySubquery
jest aliasem, który nadałem podzapytaniu lub zapytaniu w nawiasach.
Podzapytanie wybiera najwyższe pensje N (powiemy 3 w tym przypadku) i zamawia je według największej pensji.
Jeśli chcemy zobaczyć trzecią najwyższą pensję, podzapytanie zwróci:
Salary
-----------
80,000
72,000
50,000
Zewnętrzne zapytanie następnie wybiera pierwszą pensję z podzapytania, z tym że tym razem sortujemy je rosnąco, od najmniejszej do największej, więc 50 000 będzie pierwszym rekordem posortowanym rosnąco.
Jak widać, 50 000 to rzeczywiście trzecia najwyższa pensja w tym przykładzie.