Sie können einen Common Table Expression (CTE) verwenden, um die Antwort abzuleiten.
Nehmen wir an, Sie haben die folgenden Gehälter in der Tabelle Gehälter:
EmployeeID Salary
--------------------
10101 50,000
90140 35,000
90151 72,000
18010 39,000
92389 80,000
Wir verwenden:
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
Dadurch wird für jede Zeile eine Zeilennummer erstellt, nachdem sie nach dem Gehalt in absteigender Reihenfolge sortiert wurde, und dann die dritte Zeile abgerufen (die den dritthöchsten Datensatz enthält).
- SQL-Geige
Für diejenigen unter Ihnen, die keinen CTE wollen (oder in SQL 2000 feststecken):
[Hinweis :Dies ist deutlich schlechter als das obige Beispiel; Wenn Sie sie parallel mit Ausführungsplänen ausführen, ergeben sich Abfragekosten von 36 % für den CTE und 64 % für die Unterabfrage]:
SELECT TOP 1 Salary
FROM
(
SELECT TOP N Salary
FROM Salaries
ORDER BY Salary DESC
) SalarySubquery
ORDER BY Salary ASC
wobei N von Ihnen definiert wird.
SalarySubquery
ist der Alias, den ich der Unterabfrage gegeben habe, oder die Abfrage, die in Klammern steht.
Die Unterabfrage wählt die Top-N-Gehälter aus (wir sagen 3 in diesem Fall) und bestellt sie nach dem höchsten Gehalt.
Wenn wir das dritthöchste Gehalt sehen möchten, würde die Unterabfrage Folgendes zurückgeben:
Salary
-----------
80,000
72,000
50,000
Die äußere Abfrage wählt dann das erste Gehalt aus der Unterabfrage aus, außer dass wir es dieses Mal aufsteigend sortieren, was vom kleinsten zum größten sortiert, also wäre 50.000 der erste aufsteigend sortierte Datensatz.
Wie Sie sehen können, ist 50.000 tatsächlich das dritthöchste Gehalt im Beispiel.