最近在一次采访中,我被要求写一个查询,我必须不使用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
值,并基本上从薪水列表中检索任何片段。SQL Server中也有可用的other ranking functions可以使用-例如有
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
这会将您的薪水分成10组,每组相等大小-带有
NTile=1
的薪水是“TOP 10%”薪水组。关于sql - 如何在不使用TOP和子查询的情况下从表中获取第n个最高薪水?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3645528/