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)