sql >> Databáze >  >> RDS >> Sqlserver

SQL dotaz pro nalezení N-tého nejvyššího platu z tabulky platů

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.



  1. Existuje nějaký rozdíl mezi DECIMAL a NUMERIC v SQL Server?

  2. rychlý výběr náhodného řádku z velké tabulky v mysql

  3. Pivot na Oracle 10g

  4. Cheat Sheet pro Access 2021 For Dummies