sql >> Database >  >> RDS >> Sqlserver

SQL-query om het N-de hoogste salaris uit een salaristabel te vinden

U kunt een Common Table Expression (CTE) gebruiken om het antwoord af te leiden.

Stel dat u de volgende salarissen in de tabel Salarissen heeft:

 EmployeeID  Salary
--------------------
     10101   50,000
     90140   35,000
     90151   72,000
     18010   39,000
     92389   80,000

We gebruiken:

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

Hiermee wordt voor elke rij een rijnummer gemaakt nadat deze in aflopende volgorde is gesorteerd op het salaris en wordt vervolgens de derde rij opgehaald (die het op twee na hoogste record bevat).

  • SQL Fiddle

Voor degenen onder u die geen CTE willen (of vastzitten in SQL 2000):

[Opmerking :dit presteert beduidend slechter dan het bovenstaande voorbeeld; als ze naast elkaar worden uitgevoerd met een uitzonderingsschema, worden de kosten voor zoekopdrachten 36% voor de CTE en 64% voor de subquery]:

SELECT TOP 1 Salary
FROM 
(
    SELECT TOP N Salary
    FROM Salaries
    ORDER BY Salary DESC
) SalarySubquery
ORDER BY Salary ASC

waarbij N door jou is gedefinieerd.

SalarySubquery is de alias die ik aan de subquery heb gegeven, of de query die tussen haakjes staat.

Wat de subquery doet, is dat het de top N-salarissen selecteert (we zeggen 3 in dit geval), en bestelt ze met het hoogste salaris.

Als we het op twee na hoogste salaris willen zien, zou de subquery terugkeren:

 Salary
-----------
80,000
72,000
50,000

De buitenste zoekopdracht selecteert vervolgens het eerste salaris uit de subquery, behalve dat we het deze keer oplopend sorteren, wat sorteert van klein naar groot, dus 50.000 zou het eerste record zijn dat oplopend is gesorteerd.

Zoals je kunt zien, is 50.000 inderdaad het op twee na hoogste salaris in het voorbeeld.



  1. Op afstand verbinding maken met een MySQL-database op onze gedeelde server

  2. Fix Error 1064 (42000) bij gebruik van de MINUS-operator in MariaDB

  3. Gedrag van Android SQLite Journal veranderd?

  4. Hoe open je een SDF-bestand (SQL Server Compact Edition)?