K odvození odpovědi můžete použít společný tabulkový výraz (CTE).
Řekněme, že máte v tabulce Platy následující platy:
EmployeeID Salary
--------------------
10101 50,000
90140 35,000
90151 72,000
18010 39,000
92389 80,000
Použijeme:
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
Tím se vytvoří číslo řádku pro každý řádek poté, co byl seřazen podle platu v sestupném pořadí, a poté se načte třetí řádek (který obsahuje třetí nejvyšší záznam).
- SQL Fiddle
Pro ty z vás, kteří nechtějí CTE (nebo uvízli v SQL 2000):
[Poznámka :toto funguje znatelně hůře než výše uvedený příklad; jejich spuštění vedle sebe s plánem spuštění ukazuje cenu dotazu 36 % pro CTE a 64 % pro poddotaz]:
SELECT TOP 1 Salary
FROM
(
SELECT TOP N Salary
FROM Salaries
ORDER BY Salary DESC
) SalarySubquery
ORDER BY Salary ASC
kde N definujete vy.
SalarySubquery
je alias, který jsem dal dílčímu dotazu, nebo dotazu, který je v závorkách.
Dílčí dotaz vybírá horních N platů (řekneme 3 v tomto případě) a objednává je podle nejvyššího platu.
Pokud chceme vidět třetí nejvyšší plat, poddotaz vrátí:
Salary
-----------
80,000
72,000
50,000
Vnější dotaz pak vybere první plat z poddotazu, kromě toho, že jej tentokrát seřadíme vzestupně, což seřadí od nejmenšího po největší, takže 50 000 by byl první záznam seřazený vzestupně.
Jak vidíte, 50 000 je skutečně třetí nejvyšší plat v tomto příkladu.