如何在不使用TOP和子查询的情况下从表中获取第n个最高薪水?

Hot*_*ter 8 sql sql-server sql-server-2005 sql-server-2008

最近在一次采访中,我被要求写一个查询,我必须从表中获取第n个最高薪水而不使用TOP和任何子查询?

我完全感到困惑,因为我知道实现它的唯一方法是使用TOP和子查询.

请提供其解决方案.

提前致谢.

mar*_*c_s 10

尝试CTE - 公用表表达式:

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

这将按降序排列前5名工资 - 您可以使用该RowNumn值并基本上从工资列表中检索任何切片.

SQL Server中还有其他可用的排名函数 - 例如,NTILE它会将结果分成n个相同大小的组(尽可能接近),因此您可以创建10个这样的组:

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

这会将你的工资分成10组相同数量的工作组 - 而NTile=1那一组则是"最高10%"工资组.


Mar*_*ith 10

;with cte as(
Select salary,
row_number() over (order by salary desc) as rn
from salaries
)

select salary 
from cte 
where rn=@n
Run Code Online (Sandbox Code Playgroud)

(或者如果你想要第n个最高的不同工资额dense_rank,row_number则用它代替)


小智 5

Select  * 
From    Employee E1 
Where
N = (Select Count(Distinct(E2.Salary)) From Employee E2 Where E2.Salary >= E1.Salary)
Run Code Online (Sandbox Code Playgroud)