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

Come recuperare l'ennesimo stipendio più alto da un tavolo senza utilizzare TOP e sub-query?

Prova un CTE - Espressione di tabella comune:

WITH Salaries AS
(
    SELECT 
       SalaryAmount, ROW_NUMBER() OVER(ORDER BY SalaryAmount DESC) AS 'RowNum'
    FROM 
       dbo.SalaryTable
)
SELECT
  SalaryAmount
FROM
  Salaries
WHERE
   RowNum <= 5

Questo ottiene i primi 5 stipendi in ordine decrescente:puoi giocare con RowNumn valore e sostanzialmente recuperare qualsiasi fetta dall'elenco degli stipendi.

Sono disponibili altre funzioni di classificazione disponibile in SQL Server che può essere utilizzato, ad es. c'è NTILE che dividerà i tuoi risultati in n gruppi di uguali dimensioni (il più vicino possibile), quindi potresti ad es. crea 10 gruppi come questo:

WITH Salaries AS
(
    SELECT 
       SalaryAmount, NTILE(10) OVER(ORDER BY SalaryAmount DESC) AS 'NTile'
    FROM 
       dbo.SalaryTable
)
SELECT
  SalaryAmount
FROM
  Salaries
WHERE
   NTile = 1

Questo dividerà i tuoi stipendi in 10 gruppi di uguali dimensioni - e quello con NTile=1 è il gruppo di stipendi "TOP 10%".