介绍SQl server 2012的新分析函数--PERCENT_CNT()

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:

 

 

Untitled.jpg

Untitled1.jpg

CONT.jpg

请使用浏览器的分享功能分享到微信等