Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Abfrage, um das N-thöchste Gehalt aus einer Gehaltstabelle zu finden

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.