Postgres:获取数字的百分位数不一定在表格列中

时间:2018-04-20 20:01:14

标签: postgresql

想象一下,我的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并计算低于我指定数量的行数并除以行总数,但有一种计算效率更高的方法,也许?

2 个答案:

答案 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是感兴趣的数字。