摘要:在本教程中,您將學習如何使用 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() 函式返回一個介於 0 到 1 之間的百分位排名數值。
對於特定行,PERCENT_RANK() 使用以下公式計算百分位排名:
(rank - 1) / (total_rows - 1)
Code language: SQL (Structured Query Language) (sql)在此公式中,rank 是行的排名。total_rows 是被評估的總行數。
根據此公式,PERCENT_RANK() 函式對於結果集中的第一行總是返回 0。
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() 函式來計算結果集中行的百分位排名。
資料庫 #
- PostgreSQL PERCENT_RANK 函式
- Oracle PERCENT_RANK 函式
- SQL Server PERCENT_RANK 函式
- MySQL PERCENT_RANK 函式
- SQLite PERCENT_RANK 函式