SQL RANK

摘要:在本教學中,您將學習如何使用 SQL RANK() 函數來找出結果集中每一列的排名。

MySQL RANK() 函數介紹

RANK() 函數是一個視窗函數,它會為結果集分割中的每一列指定一個排名。

一列的排名由 1 加上它之前的所有排名數量決定。

RANK() 函數的語法如下:

RANK() OVER (
	PARTITION BY <expr1>[{,<expr2>...}]
	ORDER BY <expr1> [ASC|DESC], [{,<expr2>...}]
)
Code language: SQL (Structured Query Language) (sql)

在這個語法中:

  • 首先,PARTITION BY 子句會根據一或多個條件將結果集中的列分配到不同的分割區。
  • 其次,ORDER BY 子句會排序每個分割區中的列。
  • RANK() 函數會對每個分割區的列進行操作,並在跨越每個分割區邊界時重新初始化。

相同的列值會獲得相同的排名。當多個列共享相同的排名時,下一列的排名不會是連續的。這類似於奧運頒獎,如果兩位運動員並列金牌,就不會有銀牌。

以下陳述式建立一個新的資料表,名稱為 t,並插入一些範例資料

CREATE TABLE t (
	col CHAR
);
	
INSERT INTO t(col)
VALUES('A'),('B'),('B'),('C'),('D'),('D'),('E');
	
	
SELECT 
	*
FROM
	t;
Code language: SQL (Structured Query Language) (sql)

以下陳述式使用 RANK() 函數為結果集的列指定排名

SELECT
	col,
	RANK() OVER (
		ORDER BY col
	) myrank
FROM
	t;
Code language: SQL (Structured Query Language) (sql)

下圖顯示輸出結果

SQL Rank Function example

如輸出結果清楚所示,第二列和第三列由於具有相同的值而共享相同的排名。第四列獲得排名 4,因為 RANK() 函數跳過了排名 3。

請注意,如果您想要連續的排名,可以使用 DENSE_RANK() 函數。

SQL RANK() 函數範例

我們將使用範例資料庫中的 employeesdepartments 資料表進行示範。

Employees & Departments Tables

在結果集上使用 SQL RANK() 函數範例

以下陳述式會依員工的薪資對其進行排名

SELECT 
	first_name, 
	last_name, 
	salary, 
	RANK() OVER (ORDER BY salary) salary_rank
FROM 
	employees;
Code language: SQL (Structured Query Language) (sql)

以下顯示部分輸出

SQL Rank Function over result set example

在此範例中,我們省略了 PARTITION BY 子句,因此整個結果集被視為單一分割區。

ORDER BY 子句依薪資排序結果中的列。然後,RANK() 函數會根據薪資由高至低的順序,應用於結果中的每一列。

在分割區上使用 SQL RANK() 函數範例

以下陳述式會找出部門中薪資第二高的員工

WITH payroll AS (
	SELECT 
		first_name, 
		last_name, 
		department_id,
		salary, 
		RANK() OVER (
			PARTITION BY department_id
			ORDER BY salary) salary_rank
	FROM 
		employees
)
SELECT 
	first_name, 
	last_name,
	department_name,
	salary
FROM 
	payroll p
	INNER JOIN departments d 
		ON d.department_id = p.department_id
WHERE 
	salary_rank = 2;	
Code language: SQL (Structured Query Language) (sql)

在通用資料表運算式中,我們依部門找出員工的薪資排名

  • 首先,PARTITION BY 子句會將員工記錄按部門劃分為不同的分割區。
  • 然後,ORDER BY 子句會依薪資排序每個分割區中的員工。
  • 最後,RANK() 函數會為每個分割區的員工指定排名。薪資相同的員工會獲得相同的排名。

下圖說明通用資料表運算式的部分結果集

SQL Rank Function CTE

外部查詢只選取薪資排名為 2 的員工。它也與 departments 資料表聯結,以在最終結果集中傳回部門名稱。

下圖顯示查詢的輸出

SQL Rank Function over partition example

在本教學中,您學習了如何使用 SQL RANK() 函數來為結果集中的每一列指定排名。

這個教學對您有幫助嗎?