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

Consulta SQL para encontrar o enésimo salário mais alto de uma tabela salarial


Você pode usar uma expressão de tabela comum (CTE) para derivar a resposta.

Digamos que você tenha os seguintes salários na tabela Salários:
 EmployeeID  Salary
--------------------
     10101   50,000
     90140   35,000
     90151   72,000
     18010   39,000
     92389   80,000

Nós vamos usar:
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

Isso criará um número de linha para cada linha depois que ela for classificada pelo Salário em ordem decrescente e, em seguida, recuperará a terceira linha (que contém o terceiro registro mais alto).
  • Fiddle SQL

Para aqueles que não querem um CTE (ou estão presos no SQL 2000):

[Observação :isso funciona visivelmente pior do que o exemplo acima; executá-los lado a lado com planos de execução mostra um custo de consulta de 36% para o CTE e 64% para a subconsulta]:
SELECT TOP 1 Salary
FROM 
(
    SELECT TOP N Salary
    FROM Salaries
    ORDER BY Salary DESC
) SalarySubquery
ORDER BY Salary ASC

onde N é definido por você.

SalarySubquery é o alias que dei para a subconsulta ou a consulta que está entre parênteses.

O que a subconsulta faz é selecionar os N salários mais altos (diremos 3 neste caso), e os ordena pelo maior salário.

Se quisermos ver o terceiro salário mais alto, a subconsulta retornará:
 Salary
-----------
80,000
72,000
50,000

A consulta externa seleciona o primeiro salário da subconsulta, exceto que desta vez estamos classificando-o em ordem crescente, que classifica do menor para o maior, de modo que 50.000 seria o primeiro registro classificado em ordem crescente.

Como você pode ver, 50.000 é de fato o terceiro salário mais alto no exemplo.