获得已知价值的百分位数

时间:2014-04-02 06:34:03

标签: sql sql-server sql-server-2012

我有一个约5000行的表,每行有几列,以及可能包含在表列中的已知值的选择。

我要做的是依次按不同的列排序表,并找到映射到该列的已知值的粗略百分位数。我只需要大约10个百分位数的括号(例如,如果第10个百分点截止值为6且第20百分位数截止值为14,而我的已知值为7,则我将返回0.2)。

我不能依赖于我正在计算百分位数的列中包含的已知值。

我正在计算像这样的百分位'桶':

SELECT MAX(colName) as upperVal, (CAST(Percentile as float) / 10.0) as Percentile FROM (
    SELECT colName, NTILE(10) OVER(ORDER BY colNameASC) AS Percentile FROM tableName AS a
) as b GROUP BY Percentile

这给了我一个价值表:

upperVal  |  Percentile
========  |  ==========
27        |  0.1
58        |  0.2
89        |  0.3
120       |  0.4
158       |  0.5
200       |  0.6
254       |  0.7
336       |  0.8
495       |  0.9
2450      |  1

让我烦恼的部分是如何最好地遍历这些并获得已知值的百分位“桶”(不会引入太多开销)。

任何人都可以帮忙解释一下吗?

1 个答案:

答案 0 :(得分:1)

我想到了使用相关子查询的解决方案。找到大于您的值的所有上限值,然后选择较小的值:

with percentiles as (
      SELECT MAX(colName) as upperVal, (CAST(Percentile as float) / 10.0) as Percentile
      FROM (SELECT colName, NTILE(10) OVER(ORDER BY colNameASC) AS Percentile
            FROM tableName AS a
           ) as b
      GROUP BY Percentile
     )
select kv.value,
       (select top 1 Percentile
        from percentiles p
        where p.upperVal >= kv.value
        order by upperVal
       )
from KnownValues kv;

您也可以使用apply表达此信息。