Books Online对PERCENT_CNT()的描述: 基于 SQL Server 2012 列值的连续分布计算百分位数。将内插结果,且结果可能不等于列中的任何特定值
注意此处的“结果可能不等于列中的任何特定值”
以下为计算规则:
若记录数为偶数,则将中间的两个数字相加再除以2
若记录数为奇数,则取中间的数字
例子:
SELECT SalesOrderID, OrderQty, ProductID,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ProductID)
OVER (PARTITION BY SalesOrderID) AS MedianCont
FROM aaaa
WHERE SalesOrderID IN (43670, 43669, 43667, 43663)
ORDER BY SalesOrderID DESC
GO
以下为输出结果:
可以看到, PERCENTILE_CONT(0.5) 类似于取中位数,以下图片为其计算图示:
套用以下计算规则:
若记录数为偶数,则将中间的两个数字相加再除以2
若记录数为奇数,则取中间的数字
因此,salesOrderID=43670的记录有四条,记录数为偶数,因此取中间两条的productid值相加再除2,
对于salesOrderID=43667,有三条记录,记录数为奇数,因此取中间那条记录的productid值
下面是PERCENTILE_CONT的计算公式
设:
n为该组的记录数;
a=@pct*(n – 1)
i为a的整数部分
f为a的小数部分
row0和row1为从0开始计算的 row numbers,以FLOOR(a)和 CEILING(a)得到
因此:
PERCENTILE_CONT = row0.score + f * (row1.score – row0.score)
Example:
DECLARE @pct AS FLOAT = 0.1;
SELECT testid, score,
PERCENTILE_DISC(@pct) WITHIN GROUP(ORDER BY score) OVER(PARTITION BY testid) AS
percentiledisc,
PERCENTILE_CONT(@pct) WITHIN GROUP(ORDER BY score) OVER(PARTITION BY testid) AS percentilecont
FROM Stats.Scores;result: