摘要:在本教學中,您將學習如何使用 SQL PERCENT_RANK()
函數來計算結果集中資料列的百分位數排名。
PERCENT_RANK()
是一個 視窗函數,用於計算結果集中資料列的百分位數排名。
PERCENT_RANK()
函數的語法如下:
PERCENT_RANK()
OVER (
PARTITION BY expr1, expr2,...
ORDER BY expr1 [ASC|DESC], expr2 ...
)
Code language: SQL (Structured Query Language) (sql)
PERCENT_RANK()
函數返回一個介於零到一之間的百分位數排名數字。
對於特定的資料列,PERCENT_RANK()
使用以下公式來計算百分位數排名:
(rank - 1) / (total_rows - 1)
Code language: SQL (Structured Query Language) (sql)
在此公式中,rank
是資料列的排名。total_rows
是正在評估的資料列總數。
基於此公式,PERCENT_RANK()
函數始終為結果集中的第一列返回零。
PARTITION BY
子句將資料列劃分為不同的分割區,而 ORDER BY
子句指定每個分割區中資料列的邏輯順序。PERCENT_RANK()
函數會針對每個排序的分割區獨立計算。
PARTITION BY
子句是可選的。如果省略 PARTITION BY
子句,該函數會將整個結果集視為單個分割區。
SQL PERCENT_RANK() 函數範例
我們將使用來自範例資料庫的 employees
和 departments
資料表進行示範。
使用 SQL PERCENT_RANK() 於查詢結果集範例
以下查詢會找出員工按薪資計算的百分位數排名:
SELECT
first_name,
last_name,
salary,
ROUND(
PERCENT_RANK() OVER (
ORDER BY salary
)
,2) percentile_rank
FROM
employees;
Code language: SQL (Structured Query Language) (sql)
在此範例中,我們省略了 PARTITION BY
子句,因此該函數將結果集中的所有員工視為單個分割區。請注意,我們使用了 ROUND()
函數將百分位數排名四捨五入到小數點後兩位。
以下圖片顯示了輸出結果:

ORDER BY
子句對員工的薪資進行排序,而 PERCENT_RANK()
函數則按照薪資升序計算員工的百分位數排名。
讓我們分析輸出結果中的一些資料列。
- Karen 的薪資最低,不比任何人都高,因此她的百分位數排名為零。另一方面,Steven 的薪資最高,比任何人都高,因此他的百分位數排名為 1 或 100%。
- Nancy 和 Shelley 的百分位數排名為 82%,這表示他們的薪資高於其他 82% 的員工。
使用 SQL PERCENT_RANK() 於分割區範例
以下語句返回每個部門員工按薪資計算的百分位數排名:
SELECT
first_name,
last_name,
salary,
department_name,
ROUND(
PERCENT_RANK() OVER (
PARTITION BY e.department_id
ORDER BY salary
)
,2) percentile_rank
FROM
employees e
INNER JOIN departments d
ON d.department_id = e.department_id;
Code language: SQL (Structured Query Language) (sql)
以下是輸出結果:

在此範例中,我們按照部門名稱劃分員工。然後,PERCENT_RANK()
應用於每個分割區。
正如輸出結果中清楚顯示的,每當部門變更時,百分位數排名就會重置。
在本教學中,您學習了如何使用 SQL PERCENT_RANK()
函數來計算結果集中資料列的百分位數排名。