Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Requête SQL pour trouver le Nième salaire le plus élevé à partir d'une table des salaires

Vous pouvez utiliser une expression de table commune (CTE) pour dériver la réponse.

Supposons que vous ayez les salaires suivants dans le tableau Salaires :

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

Nous utiliserons :

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

Cela créera un numéro de ligne pour chaque ligne après qu'elle ait été triée par le salaire dans l'ordre décroissant, puis récupérera la troisième ligne (qui contient le troisième enregistrement le plus élevé).

  • SQL Fiddle

Pour ceux d'entre vous qui ne veulent pas de CTE (ou qui sont bloqués dans SQL 2000) :

[Remarque  :cela fonctionne nettement moins bien que l'exemple ci-dessus ; les exécuter côte à côte avec un plan d'exécution montre un coût de requête de 36 % pour le CTE et de 64 % pour la sous-requête] :

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

où N est défini par vous.

SalarySubquery est l'alias que j'ai donné à la sous-requête, ou la requête qui est entre parenthèses.

Ce que fait la sous-requête, c'est qu'elle sélectionne les N meilleurs salaires (nous dirons 3 dans ce cas), et les ordonne par le plus grand salaire.

Si nous voulons voir le troisième salaire le plus élevé, la sous-requête renverra :

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

La requête externe sélectionne ensuite le premier salaire de la sous-requête, sauf que nous le trions par ordre croissant cette fois, qui trie du plus petit au plus grand, donc 50 000 serait le premier enregistrement trié par ordre croissant.

Comme vous pouvez le voir, 50 000 est en effet le troisième salaire le plus élevé dans l'exemple.