如何在 SQL 中查找第 N 高的工资


在本文中,我们将编写一个 SQL(结构化查询语言)查询,以从数据库表中查找第 N 高的工资。我们可以获得第 2 高的工资、第 3 高的工资,依此类推。当然,这是面试中最常问到的问题之一。实现这一点的方法有很多,我们将详细了解每种技术。

问题陈述

假设我们有一个名为 employees 的表,其中包含 3 列,分别为 EmployeeId、EmployeeName 和 EmployeeSalary,如下所示:

员工ID 员工姓名 员工工资
10001 Mahesh 33000
10002 John 35000
10003 Abdul 34500
10004 Raman 38000

给定的任务是找出任何第 N 阶最高工资请求,例如第 2 高的工资是 35000,第 3 高的工资,依此类推。

数据创建

让我们使用 CREATE 查询创建表:

CREATE TABLE Employees (
   EmployeeId INT PRIMARY KEY,
   EmployeeName VARCHAR(255),
   EmployeeSalary DECIMAL(10, 2)
);

现在,我们将使用 INSERT 语句提供上面提到的记录:

INSERT INTO Employees (EmployeeId, EmployeeName, EmployeeSalary) VALUES
(10001, 'Mahesh', 33000),
(10002, 'John', 35000),
(10003, 'Abdul', 34500),
(10004, 'Raman', 38000);

在 SQL 中查找第 N 高的工资

我们可以在 SQL 中查找第 N 高的工资:

  • 使用 DISTINCT 和 LIMIT 子句
  • 使用相关子查询
  • 使用 DENSE_RANK() 函数

使用 DISTINCT 和 LIMIT 子句

让我们了解查询创建方法:

  • 找出 employeeSalary 的 DISTINCT 记录
  • 使用 ORDERBY 降序排列,将最高工资放在第 1 行
  • OFFSET 到 N-1 从排序结果中跳过前 N-1 条记录
  • 最后,LIMIT 1 获取唯一的第 N 条记录

语法

以下是查找 SQL 中第 N 高工资的查询,其中 N 表示工资的第 N 阶:

SELECT DISTINCT EmployeeSalary
FROM Employees
ORDER BY EmployeeSalary DESC
LIMIT 1 OFFSET N-1;

示例

以下是查找第 2 高工资的 SQL 查询:

SELECT DISTINCT EmployeeSalary 
FROM Employees 
ORDER BY EmployeeSalary DESC 
LIMIT 1 OFFSET 1;

同样,以下查询检索第 3 高工资:

SELECT DISTINCT EmployeeSalary 
FROM Employees 
ORDER BY EmployeeSalary DESC 
LIMIT 1 OFFSET 2;

使用相关子查询

以下是查询创建方法:

  • 创建一个子查询来计算大于指定工资的唯一工资的数量,即第 N-1 行的工资高于该指定工资。
  • 使用 WHERE 子句与主查询结合,以匹配 N-1 个更高工资的计数。

语法

以下是使用相关子查询在 SQL 中查找第 N 高工资的查询:

SELECT EmployeeSalary
FROM Employees AS e1
WHERE N-1 = (
   SELECT COUNT(DISTINCT EmployeeSalary)
   FROM Employees AS e2
   WHERE e2.EmployeeSalary > e1.EmployeeSalary
);

示例

以下是查找第 2 高工资的相关子查询 SQL 查询:

SELECT EmployeeSalary 
FROM Employees AS e1 
WHERE 1 = (
   SELECT COUNT(DISTINCT EmployeeSalary) 
   FROM Employees AS e2 
   WHERE e2.EmployeeSalary > e1.EmployeeSalary
);

同样,以下是第 3 高工资的相关 SQL 子查询:

SELECT EmployeeSalary 
FROM Employees AS e1 
WHERE 2 = (
   SELECT COUNT(DISTINCT EmployeeSalary) 
   FROM Employees AS e2 
   WHERE e2.EmployeeSalary > e1.EmployeeSalary
);

使用 DENSE_RANK() 函数

查询创建方法 -

  • 使用 ORDERBY 降序排列,将最高工资放在第 1 行
  • 识别使用 DENSE_RANK() 函数排序的每一行的排名
  • 应用 WHERE 条件以获取第 N 高工资

DENSE_RANK() 函数

函数的输出是排名,计算方法如下:

rank of a specific row = 1 + number of distinct rank values that appear before that specific row

因此,DENSE_RANK 函数为行分配排名,为第一行分配 1,依此类推。

重复记录已由 DENSE_RANK 函数处理,因为该函数使用不同的记录识别排名。

原始查询

SELECT EmployeeSalary FROM (
   SELECT EmployeeSalary, DENSE_RANK() 
   OVER (ORDER BY EmployeeSalary DESC) 
   AS salary_rank
   FROM Employees
) AS ranked_salaries
WHERE salary_rank = N;

示例

SELECT EmployeeSalary FROM (
   SELECT EmployeeSalary, DENSE_RANK() 
   OVER (ORDER BY EmployeeSalary DESC) 
   AS salary_rank
   FROM Employees
) AS ranked_salaries
WHERE salary_rank = 2;

查找第 3 高工资的 SQL 查询

SELECT EmployeeSalary FROM (
   SELECT EmployeeSalary, DENSE_RANK() 
   OVER (ORDER BY EmployeeSalary DESC) 
   AS salary_rank
   FROM Employees
) AS ranked_salaries
WHERE salary_rank = 3;

结论

可以根据具体需求使用任何一种技术,但建议使用 DENSE_RANK() 函数以在大量记录中获得更好的性能。所有上述方法都很好地处理了重复记录的条件,因此您始终可以获得正确的结果,即使不同员工的工资金额重复。

更新于: 2024年8月6日

270 次查看

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告