我有一个约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
让我烦恼的部分是如何最好地遍历这些并获得已知值的百分位“桶”(不会引入太多开销)。
任何人都可以帮忙解释一下吗?
答案 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
表达此信息。