最近在一次采访中,我被要求写一个查询,我必须不使用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/

10-11 03:31