如何在 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() 函数以在大量记录中获得更好的性能。所有上述方法都很好地处理了重复记录的条件,因此您始终可以获得正确的结果,即使不同员工的工资金额重复。
广告