适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
分析平台系统(PDW)
Microsoft Fabric 中的 SQL 分析终结点
Microsoft Fabric 中的仓库
Microsoft Fabric 中的 SQL 数据库
计算 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 子句。
<不能在函数中>指定 ORDER BY 子句<和>行或 range 子句PERCENTILE_DISC。
返回类型
返回类型由 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