SQL DENSE_RANK

摘要:在本教學中,您將學習如何使用 SQL DENSE_RANK() 函數對分割區中的資料列進行排名,且排名值之間沒有間隙。

SQL DENSE_RANK() 函數概述

DENSE_RANK() 是一個視窗函數,它會將排名分配給分割區中的資料列,且排名值之間沒有間隙。

如果每個分割區中有兩個或多個資料列具有相同的值,它們將獲得相同的排名。下一個資料列的排名會增加一。

RANK() 函數不同,DENSE_RANK() 函數總是產生連續的排名值。

DENSE_RANK() 函數的語法如下

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

在此語法中

  • 首先,PARTITION BY 子句將 FROM 子句產生的結果集劃分為多個分割區。
  • 然後,ORDER BY 指定每個分割區中資料列的順序。
  • 最後,DENSE_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)

以下陳述式同時使用 DENSE_RANK()RANK() 函數,以將排名分配給結果集的每個資料列

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

以下是輸出結果

SQL DENSE_RANK Function example

SQL DENSE_RANK() 函數範例

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

Employees & Departments Tables

在結果集上使用 SQL DENSE_RANK() 的範例

以下陳述式使用 DENSE_RANK() 函數依員工的薪資進行排名

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

在這個範例中,我們省略了 PARTITION BY 子句,因此 DENSE_RANK() 函數將整個結果集視為單一分割區。

首先,ORDER BY 子句依遞減順序對薪資進行排序。然後,DENSE_RANK() 函數根據員工的薪資金額為每位員工分配排名。

下圖顯示查詢的部分輸出

SQL DENSE_RANK Function Over Result Set example

在分割區上使用 SQL DENSE_RANK() 的範例

以下陳述式根據員工的薪資,對每個部門的員工進行排名

SELECT 
	first_name, 
	last_name, 
	department_name,
	salary, 
	DENSE_RANK() OVER (
		PARTITION BY department_name
		ORDER BY salary DESC) salary_rank
FROM 
	employees e
	INNER JOIN departments d 
		ON d.department_id = e.department_id;
Code language: SQL (Structured Query Language) (sql)

在這個範例中

  • 首先,PARTITION BY 子句根據部門名稱將員工劃分為多個分割區。
  • 然後,ORDER BY 子句根據每個部門(分割區)中員工的薪資進行排序。
  • 最後,DENSE_RANK() 函數會應用於每個分割區,以根據薪資順序為資料列分配排名。

下圖顯示查詢的部分輸出

SQL DENSE_RANK Function Over Partition example

如果您只想找到部門中薪資最高的員工,您只需在 FROM 子句中使用 子查詢,如下所示

SELECT 
	* 
FROM (
	SELECT 
		first_name, 
		last_name, 
		department_name,
		salary, 
		DENSE_RANK() OVER (
			PARTITION BY department_name
			ORDER BY salary DESC) salary_rank
	FROM 
		employees e
		INNER JOIN departments d 
			ON d.department_id = e.department_id
	) t
WHERE 
	salary_rank = 1;Code language: SQL (Structured Query Language) (sql)

以下輸出顯示部門中薪資最高的員工

SQL DENSE_RANK Function find nth highest value

在本教學中,您已經學習如何使用 SQL DENSE_RANK() 函數對分割區中的資料列進行排名,且排名值之間沒有間隙。

這個教學對您有幫助嗎?