SQL CUME_DIST

摘要:在本教學中,您將學習如何使用 SQL CUME_DIST() 函數計算資料列的累積分佈值。

SQL CUME_DIST() 函數簡介

CUME_DIST() 是一個視窗函數,用於計算一組數值中值的累積分佈。

CUME_DIST() 函數會回傳一個值,表示數值小於或等於 (<=) 目前資料列值的資料列數,除以總資料列數。

N / total_rows
Code language: SQL (Structured Query Language) (sql)

在此公式中

  • N 是數值小於或等於目前資料列值的資料列數。
  • total_rows 是正在評估的分割區或結果集中的資料列數。

CUME_DIST() 函數的回傳值範圍介於大於 0 的低值和小於或等於 1 的高值之間。

0 < CUME_DIST() <= 1
Code language: SQL (Structured Query Language) (sql)

重複的欄值會收到相同的 CUME_DIST() 值。

CUME_DIST() 函數的語法如下

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

在此語法中

  • 首先,PARTITION BY 子句將結果集分成數個分割區。如果您省略 PARTITION BY 子句,則函數會將整個結果集視為單一分割區。
  • 然後,ORDER BY 子句會對每個分割區內的資料列進行排序。
  • 最後,CUME_DIST() 函數會獨立應用於每個排序後的分割區。

SQL CUME_DIST() 函數範例

請參閱來自範例資料庫的以下 employeesdepartments 表格

Employees & Departments Tables

以下陳述式根據 employeesdepartments 表格建立一個視圖,名為 department_headcounts,以供示範

CREATE VIEW department_headcounts
AS
SELECT 
	department_name,
	COUNT(employee_id) headcount
FROM 
	employees e
	INNER JOIN departments d
		ON d.department_id = e.department_id
GROUP BY 
	e.department_id;
Code language: SQL (Structured Query Language) (sql)

以下陳述式會找出每個部門依員工人數的累積分佈值

SELECT
	department_name,
	headcount,
	ROUND(
		CUME_DIST() OVER (
			ORDER BY headcount
		)
	,2) cume_dist_val
FROM
	department_headcounts;
Code language: SQL (Structured Query Language) (sql)

以下顯示輸出

SQL CUME_DIST Function Example

在此範例中,部門按其員工人數以遞增順序排序。結果集中的總資料列數為 11。

Administration 部門有一個員工人數。Human ResourcesPublic Relations 也與 Administration 的員工人數相同。因此,有三個部門的員工人數為 1。CUME_DIST() 函數將使用以下公式來計算第一列的累積分佈值

3 / 11 = 0.27
Code language: SQL (Structured Query Language) (sql)

相同的邏輯也適用於第二列和第三列。

Marketing 部門有兩個員工人數。函數會找出其他員工人數小於或等於 2 的部門。結果為 5。因此,Marketing 部門的 CUME_DIST() 為 5 / 11 = 0.45

相同的邏輯也適用於其餘的資料列。

在本教學中,您已學習如何使用 SQL CUME_DIST() 函數計算一組數值中值的累積分佈。

這個教學對您有幫助嗎?