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

SQL-forespørgsel for at finde N. højeste løn fra en løntabel

Du kan bruge et almindeligt tabeludtryk (CTE) til at udlede svaret.

Lad os sige, at du har følgende lønninger i tabellen Lønninger:

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

Vi bruger:

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

Dette vil oprette et rækkenummer for hver række, efter at det er blevet sorteret efter løn i faldende rækkefølge, og derefter hentes den tredje række (som indeholder den tredje-højeste post).

  • SQL Fiddle

Til dem af jer, der ikke ønsker en CTE (eller sidder fast i SQL 2000):

[Bemærk :dette fungerer mærkbart dårligere end ovenstående eksempel; at køre dem side om side med en udførelsesplan viser en forespørgselsomkostning på 36 % for CTE og 64 % for underforespørgslen]:

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

hvor N er defineret af dig.

SalarySubquery er det alias jeg har givet til underforespørgslen, eller forespørgslen der står i parentes.

Hvad underforespørgslen gør, er, at den vælger de bedste N-lønninger (vi siger 3 i dette tilfælde), og beordrer dem efter den største løn.

Hvis vi ønsker at se den tredje højeste løn, vil underforespørgslen returnere:

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

Den ydre forespørgsel vælger derefter den første løn fra underforespørgslen, bortset fra at vi sorterer den stigende denne gang, som sorterer fra mindste til største, så 50.000 ville være den første post, der sorteres stigende.

Som du kan se, er 50.000 faktisk den tredje højeste løn i eksemplet.



  1. Gendan dump på fjernmaskinen

  2. Oracle ORA-00979 - ikke et GROUP BY-udtryk

  3. Hvorfor er der huller i min IDENTITY-kolonneværdier?

  4. Generer en tilfældig dato i Oracle med DBMS_RANDOM