NTILE() 函數
NTILE() 是窗口函數中的排名函數,用來將資料平均分成指定數量的組別(桶),並為每一列標記它屬於第幾組。
NTILE 語法
NTILE(n) OVER (
[PARTITION BY column_name(s)]
ORDER BY column_name(s)
)
n: 要分成的組數ORDER BY: 決定分組依據的排序方式
NTILE 基本用法 (Example)
假設我們有一個 employees 資料表,共 8 筆資料:
| E_Id | Name | Salary |
|---|---|---|
| 1 | 張一 | 80000 |
| 2 | 王二 | 70000 |
| 3 | 李三 | 65000 |
| 4 | 趙四 | 60000 |
| 5 | 陳五 | 55000 |
| 6 | 林六 | 50000 |
| 7 | 黃七 | 45000 |
| 8 | 周八 | 40000 |
將員工依薪資分成 4 組:
SELECT
Name,
Salary,
NTILE(4) OVER (ORDER BY Salary DESC) AS quartile
FROM employees;
查詢結果:
| Name | Salary | quartile |
|---|---|---|
| 張一 | 80000 | 1 |
| 王二 | 70000 | 1 |
| 李三 | 65000 | 2 |
| 趙四 | 60000 | 2 |
| 陳五 | 55000 | 3 |
| 林六 | 50000 | 3 |
| 黃七 | 45000 | 4 |
| 周八 | 40000 | 4 |
8 筆資料分成 4 組,每組各 2 筆。
資料筆數無法整除時
當資料筆數無法被 n 整除時,NTILE 會將多餘的資料分配到前面的組別。
例如 10 筆資料分成 3 組:
- 第 1 組: 4 筆
- 第 2 組: 3 筆
- 第 3 組: 3 筆
實務應用:百分位數分析
將客戶依消費金額分成 10 等分(十分位數):
SELECT
customer_id,
total_spent,
NTILE(10) OVER (ORDER BY total_spent DESC) AS decile
FROM customer_summary;
這樣可以快速識別出前 10% 的高價值客戶(decile = 1)。
實務應用:四分位數 (Quartile)
SELECT
Name,
Salary,
CASE NTILE(4) OVER (ORDER BY Salary DESC)
WHEN 1 THEN '前 25% (Q1)'
WHEN 2 THEN '25-50% (Q2)'
WHEN 3 THEN '50-75% (Q3)'
WHEN 4 THEN '後 25% (Q4)'
END AS salary_quartile
FROM employees;
搭配 PARTITION BY 使用
在各部門內分別進行分組:
SELECT
Name,
Dept,
Salary,
NTILE(3) OVER (PARTITION BY Dept ORDER BY Salary DESC) AS dept_tier
FROM employees;
這樣每個部門的員工會各自被分成 3 個等級。