Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Query SQL per trovare l'ennesimo stipendio più alto da una tabella degli stipendi

È possibile utilizzare una Common Table Expression (CTE) per derivare la risposta.

Supponiamo che tu abbia i seguenti stipendi nella tabella Stipendi:

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

Useremo:

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

Questo creerà un numero di riga per ogni riga dopo che è stata ordinata in base allo stipendio in ordine decrescente, quindi recupererà la terza riga (che contiene il terzo record più alto).

  • SQL Fiddle

Per quelli di voi che non vogliono un CTE (o sono bloccati in SQL 2000):

[Nota :questo funziona notevolmente peggio dell'esempio sopra; eseguirli fianco a fianco con un piano di esecuzione mostra un costo della query del 36% per il CTE e del 64% per la sottoquery]:

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

dove N è definito da te.

SalarySubquery è l'alias che ho dato alla sottoquery o la query che è tra parentesi.

Quello che fa la sottoquery è selezionare i primi N stipendi (diremo 3 in questo caso) e li ordina per lo stipendio più alto.

Se vogliamo vedere il terzo stipendio più alto, la sottoquery restituirà:

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

La query esterna seleziona quindi il primo stipendio dalla sottoquery, tranne per il fatto che questa volta lo stiamo ordinando in ordine crescente, che ordina dal più piccolo al più grande, quindi 50.000 sarebbe il primo record ordinato in modo crescente.

Come puoi vedere, 50.000 è effettivamente il terzo stipendio più alto nell'esempio.