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