sql >> Databasteknik >  >> RDS >> Sqlserver

Hur hämtar man den n:e högsta lönen från en tabell utan att använda TOP och sub-query?

Prova ett 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

Detta får de 5 bästa lönerna i fallande ordning - du kan spela med RowNumn värde och i princip hämta valfri del från lönelistan.

Det finns andra rankningsfunktioner tillgänglig i SQL Server som också kan användas - t.ex. det finns NTILE vilket kommer att dela upp dina resultat i n grupper av lika stora (så nära som möjligt), så att du kan t.ex. skapa 10 grupper så här:

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

Detta kommer att dela upp dina löner i 10 lika stora grupper - och den med NTile=1 är lönegruppen "TOPP 10%".



  1. Summa tidslängd efter platsändring

  2. Returnera frågeresultat som en kommaseparerad lista i Oracle

  3. Strömma data från Postgres till Python

  4. Kodningsproblem i AJAX