PERCENTILE_DISC (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库

计算 SQL Server 中整个行集内或行集的非重复分区内已排序值的特定百分位数。 对于给定的百分位数值 P ,PERCENTILE_DISC 在 ORDER BY 子句中对表达式值进行排序。 然后,它返回值,其中给定的最小 CUME_DIST 值(相对于相同的排序规范)大于或等于 P 。例如,PERCENTILE_DISC (0.5) 将计算表达式的第 50 百分位数(也即中值)。 PERCENTILE_DISC 根据列值的离散分布来计算百分位数。 结果等于特定列值。

Transact-SQL 语法约定

语法

PERCENTILE_DISC ( numeric_literal ) WITHIN GROUP ( ORDER BY order_by_expression [ ASC | DESC ] )  
    OVER ( [ <partition_by_clause> ] )  

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

literal
要计算的百分位数。 该值必须介于 0.0 和 1.0 之间。

WITHIN GROUP ( ORDER BY order_by_expression [ ASC | DESC)**
指定要排序的一系列值,并计算百分位数。 仅允许一个 order_by_expression 。 默认的排序顺序为升序。 这一系列值可属于可有效进行排序操作的任何数据类型。

OVER (<partition_by_clause>)**
将 FROM 子句的结果集分为多个分区。 百分位数函数应用于这些分区。 有关详细信息,请参阅 OVER 子句 (Transact-SQL)。 无法在 PERCENTILE_DISC 函数中指定 <ORDER BY 子句> 和 <rows 或 range 子句>。

返回类型

返回类型由 order_by_expression 类型决定 。

兼容性支持

在兼容级别 110 和更高级别中,WITHIN GROUP 是保留关键字。 有关详细信息,请参阅 ALTER DATABASE 兼容性级别 (Transact-SQL)

一般备注

数据集中的任何 null 都将被忽略。

PERCENTILE_DISC 具有不确定性。 有关详细信息,请参阅 Deterministic and Nondeterministic Functions

示例

基本语法示例

下面的示例使用 PERCENTILE_CONT 和 PERCENTILE_DISC 函数查找每个部门的员工薪金中值。 它们可能不会返回相同的值:

  • PERCENTILE_CONT 返回适当的值,即使它在数据集中不存在,也不例外。
  • PERCENTILE_DISC 返回实际集值。
USE AdventureWorks2022;  
  
SELECT DISTINCT Name AS DepartmentName  
      ,PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ph.Rate)   
                            OVER (PARTITION BY Name) AS MedianCont  
      ,PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY ph.Rate)   
                            OVER (PARTITION BY Name) AS MedianDisc  
FROM HumanResources.Department AS d  
INNER JOIN HumanResources.EmployeeDepartmentHistory AS dh   
    ON dh.DepartmentID = d.DepartmentID  
INNER JOIN HumanResources.EmployeePayHistory AS ph  
    ON ph.BusinessEntityID = dh.BusinessEntityID  
WHERE dh.EndDate IS NULL;  

以下为部分结果集。

DepartmentName        MedianCont    MedianDisc
Document Control       16.8269      16.8269
Engineering            34.375       32.6923
Executive              54.32695     48.5577
Human Resources        17.427850    16.5865

示例:Azure Synapse Analytics 和 Analytics Platform System (PDW)

基本语法示例

下面的示例使用 PERCENTILE_CONT 和 PERCENTILE_DISC 函数查找每个部门的员工薪金中值。 它们可能不会返回相同的值:

  • PERCENTILE_CONT 返回适当的值,即使它在数据集中不存在,也不例外。
  • PERCENTILE_DISC 返回实际集值。
-- Uses AdventureWorks  
  
SELECT DISTINCT DepartmentName  
       ,PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY BaseRate)  
        OVER (PARTITION BY DepartmentName) AS MedianCont  
       ,PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY BaseRate)  
        OVER (PARTITION BY DepartmentName) AS MedianDisc  
FROM dbo.DimEmployee;  

以下为部分结果集。

DepartmentName        MedianCont    MedianDisc  
--------------------   ----------   ----------  
Document Control       16.826900    16.8269  
Engineering            34.375000    32.6923  
Human Resources        17.427850    16.5865  
Shipping and Receiving  9.250000     9.0000

另请参阅

PERCENTILE_CONT (Transact-SQL)