sql >> Databasteknik >  >> RDS >> Sqlserver

SQL-fråga för att hitta den n:e högsta lönen från en lönetabell

Du kan använda ett Common Table Expression (CTE) för att härleda svaret.

Låt oss säga att du har följande löner i tabellen Löner:

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

Vi kommer att använda:

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

Detta kommer att skapa ett radnummer för varje rad efter att den har sorterats efter lön i fallande ordning, och sedan hämta den tredje raden (som innehåller den tredje högsta posten).

  • SQL-fiol

För er som inte vill ha en CTE (eller har fastnat i SQL 2000):

[Obs :detta presterar märkbart sämre än exemplet ovan; att köra dem sida vid sida med en exekutionsplan visar en frågekostnad på 36 % för CTE och 64 % för underfrågan]:

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

där N definieras av dig.

SalarySubquery är det alias jag har gett till underfrågan, eller frågan som står inom parentes.

Vad underfrågan gör är att den väljer de högsta N-lönerna (vi säger 3 i detta fall), och beordrar dem med den högsta lönen.

Om vi ​​vill se den tredje högsta lönen skulle underfrågan returnera:

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

Den yttre frågan väljer sedan den första lönen från underfrågan, förutom att vi sorterar den stigande den här gången, som sorterar från minsta till största, så 50 000 skulle vara den första posten sorterade stigande.

Som du kan se är 50 000 verkligen den tredje högsta lönen i exemplet.



  1. SQL:Upprepa en resultatrad flera gånger och numrera raderna

  2. Bästa sättet att kontrollera om mysql_query gav några resultat?

  3. Kan jag få en plpgsql-funktion att returnera ett heltal utan att använda en variabel?

  4. Skapa ny tabell genom att välja data från andra tabeller med CREATE TABLE AS