我正确计算数据集的中位数吗?

时间:2014-10-30 13:08:59

标签: sql reporting-services reporting median percentile

我正在尝试在ssrs 2012中生成一个显示中位数成本的列。

我一直在搜索这个问题,并编写了一个PERCENTILE_CONT查询来尝试实现这一目标。

这是我正在使用的查询:

SELECT srt.Name,
    cast(sum(sr.price) as int) as AvgCost,
    cast(sum(sr.cost) as int) as AvgTransCost,
    cast(avg(sr.TotalTimeSpent) as int) as TotalTimeSpent,
    percentile_cont(.5) WITHIN GROUP(ORDER BY sum(sr.price)) OVER(PARTITION BY srt.Name) AS MedianSpend
from 
    ServiceReq sr, ServiceReqTemplate srt

运行报告时,结果如下: If you look at the very last row, you'll notice the avgcost is $46, and the cost median is $46.25

这是中位数吗?为什么所有其他avgcosts和medians都一样?如果我将PERCENTILE_CONT(.5)更改为PERCENTILE_CONT(.9),则Median列没有变化 - 这使我相信这是中位数的错误值:(

1 个答案:

答案 0 :(得分:1)

您正在使用PERCENTILE_CONT(CONT =连续)

根据SQL Server中列值的连续分布计算百分位数。结果是内插的,可能不等于列中的任何特定值。

http://msdn.microsoft.com/en-us/library/hh231473.aspx

而你想要的是PERCENTILE_DISC(DISC =离散)

对于给定的百分位值P,PERCENTILE_DISC对ORDER BY子句中的表达式值进行排序,并返回大于或等于CUME_DIST值最小的值(相对于相同的排序规范)例如,PERCENTILE_DISC (0.5)将计算表达式的第50个百分位数(即中位数)。

http://msdn.microsoft.com/en-us/library/hh231327.aspx