如何在 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 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

立即開始
廣告