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