SQL PERCENT_RANK

摘要:在本教程中,您将学习如何使用 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() 函数示例

我们将使用 示例数据库 中的 employeesdepartments 表进行演示。

使用 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() 函数将百分位数排名四舍五入到两位小数。

下图显示了输出

SQL PERCENT_RANK Function Over Result Set Example

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)

以下是输出

SQL PERCENT_RANK Function Over partition Example

在此示例中,我们按部门名称对员工进行划分。然后将 PERCENT_RANK() 应用于每个分区。

正如输出中清楚显示的一样,每当部门发生改变时,百分位数排名就会被重置。

在该教程中,您学习了如何使用 SQL PERCENT_RANK() 函数计算结果集中行的百分位数排名。

本教程是否有用?