想象一下,我的my_variable
中有一列my_table
个浮点数。我知道如何将此my_variable
列中的每一行转换为百分位数,但我的问题是:我在表格中有一个不一定的数字x
。我们称之为7.67
。如何有效地计算7.67
的{{1}}分布中my_variable
的位置?我希望能够说“7.67在16.7百分位数”或“7.67大于my_variable
中行数的16.7%”。请注意,7.67不是从列中获取的,而是我在SQL查询本身中输入它。
我正在考虑按升序排序my_variable
并计算低于我指定数量的行数并除以行总数,但有一种计算效率更高的方法,也许?
答案 0 :(得分:1)
如果您的数据不经常更改,您可以使用实体化视图或其他表格,将其称为percentiles
,您可以在其中存储100或1.000(具体取决于您需要的精度)。此表应在value
列上具有降序索引。
每行包含达到特定百分位数的最小值和百分位数。
然后你只需要获得值大于给定数据的第一行并读取百分位值。
在您的示例中,该表将包含1.000行,您可能会喜欢:
Percentile value
16.9 7.71
16.8 7.69
16.7 7.66
16.6 7.65
16.5 7.62
您的查询可能类似于:
SELECT TOP 1 Percentile FROM percentiles where 7.67 < value ORDER BY value desc
如果您所做的SELECT数量远远大于my_table
表中的更新数量,那么这是一个有效的解决方案。
答案 1 :(得分:0)
我最终做了:
select (avg(dummy_var::float))
from (
select case when var_name < 3.14 then 1 else 0 end as dummy_var
from table_name where var_name is not null
)
var_name
是感兴趣的变量,table_name
是感兴趣的表格,3.14
是感兴趣的数字。