计算第95百分位值,但不一定来自数据集

时间:2013-10-29 22:36:07

标签: sql tsql sql-server-2008-r2 statistics

我试图弄清楚如何计算给定数据集的第95百分位值。我可以使用下面的T-SQL从数据集中获取第95百分位值 ,但下面的代码总是从>数据集中获得值。 / p>

SELECT MIN(Value) 
FROM
(
    SELECT TOP 95 PERCENT WITH TIES Value
    FROM [Sample].[dbo].[numbers]
    ORDER BY Value DESC
) AS Temp

例如,对于数据集 23,5,11,22,25,14 ,第95百分位数值为每个Excel 24.5,但SQL Server不会将此值返回为它不在数据集中。

有人可以建议他们是否有任何建议?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

看起来你想要一个“插值”中位数。 Yucch。但是,您可以使用SQL执行此操作。只需明确计算:

select (max(case when rownum <= 0.95 * total then value end) +
        min(case when rownum >= 0.95 * total then value end)
       ) / 2.0 as Interpolated_95th
from (SELECT n.*, row_number() over (order by value) as rownum,
             count(*) over () as total
      FROM [Sample].[dbo].[numbers] n
     ) t

请注意,这适用于正好有20行的倍数(因此第95个百分位位于19x位置),因为相等 - min()max()将是相同。如果在其他情况下也有效,则始终将这两个值中间的点返回。

注意:我并不认为这比SQL返回的值更有效。通过中位数和百分位数的定义,两者之间的任何值都同样有效,并且使用任一极值都有一个很好的论据。也就是说,我可以非常感谢在现实世界中,你可能必须这样做。