Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como buscar o enésimo salário mais alto de uma tabela sem usar TOP e subconsulta?


Tente um CTE - Expressão de tabela comum:
WITH Salaries AS
(
    SELECT 
       SalaryAmount, ROW_NUMBER() OVER(ORDER BY SalaryAmount DESC) AS 'RowNum'
    FROM 
       dbo.SalaryTable
)
SELECT
  SalaryAmount
FROM
  Salaries
WHERE
   RowNum <= 5

Isso obtém os 5 principais salários em ordem decrescente - você pode jogar com o RowNumn valor e basicamente recuperar qualquer fatia da lista de salários.

Existem outras funções de classificação disponível no SQL Server que também pode ser usado - por exemplo, há NTILE que dividirá seus resultados em n grupos de tamanho igual (o mais próximo possível), para que você possa, por exemplo, crie 10 grupos assim:
WITH Salaries AS
(
    SELECT 
       SalaryAmount, NTILE(10) OVER(ORDER BY SalaryAmount DESC) AS 'NTile'
    FROM 
       dbo.SalaryTable
)
SELECT
  SalaryAmount
FROM
  Salaries
WHERE
   NTile = 1

Isso dividirá seus salários em 10 grupos de tamanho igual - e aquele com NTile=1 é o grupo de salários "TOP 10%".