适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
分析平台系统(PDW)
Microsoft Fabric 中的 SQL 分析终结点
Microsoft Fabric 中的仓库
Microsoft Fabric 中的 SQL 数据库
根据 SQL Server 数据库引擎中列值的连续分布计算百分位数。 结果被内插,并且可能不等于列中的任何特定值。
语法
PERCENTILE_CONT ( numeric_literal )
WITHIN GROUP ( ORDER BY order_by_expression [ ASC | DESC ] )
OVER ( [ <partition_by_clause> ] )
参数
numeric_literal
要计算的百分位数。 该值必须介于和 0.0. 之间1.0。
在组内(按order_by_expression排序)
指定要排序的数值列表,并计算百分位数。 仅允许一个 order_by_expression 。 表达式必须计算得出精确的或近似数值类型,并且不允许使用其他数据类型。 精确数值类型为 int、bigint、smallint、tinyint、numeric、bit、decimal、smallmoney 和 money 。 近似数值类型为 float 和 real 。 默认的排序顺序为升序。
OVER ( <partition_by_clause> )
将子句生成的 FROM 结果集划分为应用百分位函数的分区。 有关详细信息,请参阅 SELECT - OVER 子句。
ORDER BY不能在函数中<rows or range clause>指定子句和OVERPERCENTILE_CONT语法。
返回类型
float(53)
兼容性支持
WITHIN GROUP 是一个保留关键字,从兼容级别 110开始。 有关详细信息,请参阅 ALTER DATABASE 兼容级别。
注解
数据集中的任何 null 都将被忽略。
PERCENTILE_CONT 具有不确定性。 有关详细信息,请参阅 Deterministic and Nondeterministic Functions。
示例
本文中的代码示例使用 AdventureWorks2025 或 AdventureWorksDW2025 示例数据库,可以从 Microsoft SQL Server 示例和社区项目 主页下载该数据库。
A. 查找每个部门的员工工资中位数
以下示例使用 PERCENTILE_CONT 并 PERCENTILE_DISC 查找每个部门的员工工资中位数。 这些函数可能不会返回相同的值。
PERCENTILE_CONT 内插适当的值,该值可能或可能存在于数据集中,同时 PERCENTILE_DISC 始终从集中返回实际值。
USE AdventureWorks2022;
GO
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)
以下示例使用 AdventureWorksDW2012 示例数据库。
B. 查找每个部门的员工工资中位数
以下示例使用 PERCENTILE_CONT 并 PERCENTILE_DISC 查找每个部门的员工工资中位数。 这些函数可能不会返回相同的值。
PERCENTILE_CONT 内插适当的值,该值可能或可能存在于数据集中,同时 PERCENTILE_DISC 始终从集中返回实际值。
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