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

Postgresql Postgres:获取不一定在表列中的数字百分比,postgresql,Postgresql,假设我在我的表中有一列我的浮动变量。我知道如何将my_变量列中的每一行转换为百分位数,但我的问题是:我有一个不一定在表中的数字x。我们叫它7.67吧。我如何有效地计算7.67在我的_变量分布中的位置?我想说7.67在16.7%的百分位数中,或者7.67大于我的_变量中16.7%的行。请注意,7.67不是从列中提取的内容,但我将其输入到SQL查询本身中 我在考虑按升序排列我的_变量,并计算低于我指定的行数的行数,然后除以总行数,但是否有更有效的计算方法,也许?如果您的数据不经常更改,您可以使用物化

假设我在我的表中有一列我的浮动变量。我知道如何将my_变量列中的每一行转换为百分位数,但我的问题是:我有一个不一定在表中的数字x。我们叫它7.67吧。我如何有效地计算7.67在我的_变量分布中的位置?我想说7.67在16.7%的百分位数中,或者7.67大于我的_变量中16.7%的行。请注意,7.67不是从列中提取的内容,但我将其输入到SQL查询本身中


我在考虑按升序排列我的_变量,并计算低于我指定的行数的行数,然后除以总行数,但是否有更有效的计算方法,也许?

如果您的数据不经常更改,您可以使用物化视图或其他表,称之为百分位数,根据需要的精度存储100或1.000。此表的值列上应有一个降序索引

每行包含达到某个百分位的最小值和百分位本身

然后,您只需要获取值大于给定数据的第一行,并读取百分位值

在您的示例中,该表将包含1.000行,您可以有如下内容:

百分位值 16.9 7.71 16.8 7.69 16.7 7.66 16.6 7.65 16.5 7.62

您的查询可能类似于:

从百分位数中选择前1个百分位数,其中7.67<值顺序按值描述

如果您所做的选择数量远大于my_table表中的更新数量,则这是一个有效的解决方案。

我最后做了:

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是感兴趣的数量