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.