PERCENTILE_DISC(Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics分析平台系统 (PDW)Microsoft Fabric 中的 SQL 分析端点Microsoft Fabric 中的仓库

计算 SQL Server 中整个行集内或行集的非重复分区内已排序值的特定百分位数。 对于给定百分位值 PPERCENTILE_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> ] )

参数

literal

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

在 GROUP (订单依据 order_by_expression [ ASC |DESC ]

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

OVER ( <partition_by_clause> )

FROM 子句的结果集划分为分区。 百分位数函数应用于这些分区。 有关详细信息,请参阅 SELECT - OVER 子句。 <不能在函数中PERCENTILE_DISC指定 ORDER BY 子句>和<行或 range 子句>。

返回类型

返回类型由 order_by_expression 类型决定 。

兼容性支持

在兼容性级别 110 及更高版本下, WITHIN GROUP 是保留关键字。 有关详细信息,请参阅 ALTER DATABASE 兼容级别

注解

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

PERCENTILE_DISC 是不确定的。 有关详细信息,请参阅 “确定性”和“不确定”函数

示例

基本语法示例

以下示例使用 PERCENTILE_CONTPERCENTILE_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_CONTPERCENTILE_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