PERCENTILE_DISC (Transact-SQL)

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

主题链接图标 Transact-SQL 语法约定 (Transact-SQL)

语法

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

参数

  • 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 都将被忽略。

示例

A.基本语法示例

下面的示例使用 PERCENTILE_CONT 和 PERCENTILE_DISC 函数找出每个部门内雇员的薪金中值。 请注意,这些函数可能不返回相同的值。 这是因为,PERCENTILE_CONT 内插适当的值,而无论它在数据集中是否存在,而 PERCENTILE_DISC 始终从数据集中返回实际值。

USE AdventureWorks2012;

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

请参阅

参考

PERCENTILE_CONT (Transact-SQL)