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

Comment récupérer le nième salaire le plus élevé d'une table sans utiliser TOP et sous-requête ?

Essayez une CTE - Common Table Expression :

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

Cela obtient les 5 meilleurs salaires par ordre décroissant - vous pouvez jouer avec le RowNumn valeur et récupère essentiellement n'importe quelle tranche de la liste des salaires.

Il existe d'autres fonctions de classement disponible dans SQL Server qui peut également être utilisé - par ex. il y a NTILE qui divisera vos résultats en n groupes de taille égale (aussi étroitement que possible), afin que vous puissiez par ex. créez 10 groupes comme ceci :

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

Cela divisera vos salaires en 10 groupes de taille égale - et celui avec NTile=1 est le groupe de salaires "TOP 10 %".