NTILE() 函數

NTILE() 是窗口函數中的排名函數,用來將資料平均分成指定數量的組別(桶),並為每一列標記它屬於第幾組。

NTILE 語法

NTILE(n) OVER (
    [PARTITION BY column_name(s)]
    ORDER BY column_name(s)
)
  • n: 要分成的組數
  • ORDER BY: 決定分組依據的排序方式

NTILE 基本用法 (Example)

假設我們有一個 employees 資料表,共 8 筆資料:

E_IdNameSalary
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;

查詢結果:

NameSalaryquartile
張一800001
王二700001
李三650002
趙四600002
陳五550003
林六500003
黃七450004
周八400004

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 個等級。