最近,在一次采访中,我被要求编写一个查询,其中我必须不使用TOP和任何子查询从表中获取第n个最高薪水?
我完全困惑,因为我知道实现它的唯一方法是同时使用TOP和子查询。
请提供其解决方案。
提前致谢。
尝试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
这将按降序获得前5名薪水-您可以使用该RowNumn值,并基本上从薪水列表中检索任何片段。
RowNumn
还有其他的排名功能,可用于在SQL Server中可用的,太-例如,有NTILE将(尽可能地)你的结果分成大小相等的n组,所以你可以创建如10组这样的:
NTILE
WITH Salaries AS ( SELECT SalaryAmount, NTILE(10) OVER(ORDER BY SalaryAmount DESC) AS 'NTile' FROM dbo.SalaryTable ) SELECT SalaryAmount FROM Salaries WHERE NTile = 1
这会将您的薪水分成10组,每个组的大小相同,而其中一组NTile=1是“ TOP 10%”组的薪水。
NTile=1