如何在 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() 函式以在大量記錄中獲得更好的效能。所有上述方法都很好地處理了重複記錄的條件,因此您始終可以獲得正確的結果,即使不同員工的工資金額重複。
廣告