Sql 获取已知值的百分比

Sql 获取已知值的百分比,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有一个约5000行的表,每个行有几列,以及一组已知值,这些值可能包含在表的列中,也可能不包含在表的列中 我要做的是依次按不同的列对表进行排序,并为映射到该列的已知值找到一个粗略的百分位数。我只需要10%左右的括号,例如,如果第10个百分位数的截止值是6,第20个百分位数的截止值是14,而我的已知值是7,那么我会得到0.2 我不能依赖于我计算百分位数的列中包含的已知值 我是这样计算百分位“桶”的: SELECT MAX(colName) as upperVal, (CAST(Percentile

我有一个约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
困扰我的部分是如何最好地通过这些循环,在不引入太多开销的情况下获得已知值的百分位“bucket”


有人能帮我解释一下吗?

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

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来表示这一点。

在与另一位开发人员调试完rubber duck后,我们得到了一个非常类似的解决方案:从Select MAXcolName中选择TOP 1 Percentile作为upperVal,从Select colName中选择CASTPercentile作为float/10.0作为Percentile,NTILE10按colName ASC作为百分比从tableName作为a作为b组按百分比作为c进行超额订购,其中upperVal