编写一个 SQL Server 查询来查找第 N 高的工资、第 2 高的工资或第 3 高的工资是最常见的面试问题。在本文中,我们将向您展示使用示例编写查找第 N 高工资查询的最佳可能方法。
为了演示此查找第 N 高工资的查询,我们使用了“员工详细信息”表。

查找第 N 高工资的 SQL 查询示例
在此 SQL Server 示例中,我们将使用 派生表 概念来查找第 3 高的工资。
SELECT TOP 1 [FirstName]
,[LastName]
,[Education]
,[YearlyIncome] AS 'Highest Salary'
,[Sales]
FROM (
SELECT DISTINCT TOP 3 [FirstName]
,[LastName]
,[Education]
,[YearlyIncome]
,[Sales]
FROM [EmployeesDetails]
ORDER BY [YearlyIncome] DESC
) EMP
ORDER BY [YearlyIncome] ASC
FROM 子句中的查询选择按工资降序排序的前三名员工。我建议您参考 Top 子句和 Order by。如果您想要第 2 高的工资,则在 Top 子句中将 3 替换为 2。

主输出:并且最 频繁 查询按升序返回第一个记录。

查找第 4 高工资的 SQL 查询示例
以下查询用于查找第 4 高的工资。为此,我们使用 ROW NUMBER 概念来查找第 4 高的工资。您也可以使用任何 排名函数,例如 Rank、Dense Rank 和 Ntile 来获得相同的结果。
SELECT [FirstName]
,[LastName]
,[Education]
,[YearlyIncome]
,[ROW NUMBER] AS 'Highest Salary'
,[Sales]
FROM (
SELECT [FirstName]
,[LastName]
,[Education]
,[YearlyIncome]
,ROW_NUMBER() OVER (
ORDER BY [YearlyIncome] DESC
) AS [ROW NUMBER]
,[Sales]
FROM [EmployeesDetails]
) EMP
WHERE [ROW NUMBER] = 4
如您所见,内部查询中的 Row_Number() 根据年收入为每个员工分配排名。

我们从内部查询中选择所需的排名。如果您想要第 2 高的工资,则在 WHERE 子句中将 4 替换为 2。

您也可以使用 CTE 来获得相同的结果。
查找每个组中第 N 高工资的 SQL 查询
我们查找每个组中的第 2 高工资。这与我们在上一个示例中使用的查询相同,但我们添加了 PARTITION BY 子句来分隔组。
SELECT [FirstName]
,[LastName]
,[Education]
,[YearlyIncome]
,[ROW NUMBER] AS 'Highest Salary'
,[Sales]
FROM (
SELECT [FirstName]
,[LastName]
,[Education]
,[YearlyIncome]
,ROW_NUMBER() OVER (
PARTITION BY [Education]
ORDER BY [YearlyIncome] DESC
) AS [ROW NUMBER]
,[Sales]
FROM [EmployeesDetails]
) EMP
WHERE [ROW NUMBER] = 2
如您所见,内部查询中的 Row_Number() 根据年收入为每个分区(教育)分配排名。

我们从内部查询中选择所需的排名。同样,如果您想要第 3 高的工资,则在 WHERE 子句中将 2 替换为 3。

评论已关闭。