适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
分析平台系统 (PDW)
Microsoft Fabric 中的 SQL 分析端点
Microsoft Fabric 中的仓库
计算 SQL Server 中整个行集内或行集的非重复分区内已排序值的特定百分位数。 对于给定百分位值 P, PERCENTILE_DISC 对子句中的 ORDER BY 表达式值进行排序。 然后,它返回给定的最小值 CUME_DIST (与相同排序规范相同)的值,该值大于或等于 P。例如, PERCENTILE_DISC (0.5) 计算表达式的第 50 百分位(即中间值)。
PERCENTILE_DISC 根据列值的离散分布计算百分位数。 结果等于特定列值。
语法
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_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