Postgres(亚马逊RDS)如何计算加权平均值

时间:2016-01-03 12:33:44

标签: postgresql amazon-rds postgresql-9.4

我正在使用Amazon RDS Postgres数据库(9.4.4),我想计算一些数据的加权平均值。

我发现以下扩展名看起来非常适合这项工作。 https://github.com/Kozea/weighted_mean

但是我现在不确定如何安装扩展程序,因为我的初步研究显示只有“支持”#允许扩展。

http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html#PostgreSQL.Concepts.General.FeatureSupport

使用此扩展程序有哪些选项。我不想重新发明轮子,我不熟悉在Postgres中安装任何类型的功能/扩展。

由于

3 个答案:

答案 0 :(得分:7)

为什么你不发出这样的简单查询:

for item in chain.from_iterable([list1,list2,list3]):
    print(item)

当然你需要改变你的领域(单位价格,数量)

答案 1 :(得分:2)

要注册新的自定义扩展,您需要在Postgres安装的contrib目录中添加适当的脚本。 AWS 允许您拥有如此精细的控件。

简而言之,您无法添加任何自定义扩展程序(除了您提供的linkpg_available_extensions视图中指定的扩展程序)到Amazon RDS服务。

这是使用DBaaS(数据库即服务)解决方案的缺点之一。

答案 2 :(得分:1)

SUM(value*weight)/SUM(weight)答案很好,但是如果你需要不断重复使用它,那么创建一个聚合函数会更方便。

CREATE FUNCTION avg_weighted_step(state numeric[], value numeric, weight numeric)
RETURNS numeric[]
LANGUAGE plpgsql
AS $$
BEGIN
    RETURN array[state[1] + value*weight, state[2] + weight];
END;
$$ IMMUTABLE;


CREATE FUNCTION avg_weighted_finalizer(state numeric[])
RETURNS numeric
LANGUAGE plpgsql
AS $$
BEGIN
    IF state[2] = 0 THEN
        RETURN null;
    END IF;
    RETURN state[1]/state[2];
END;
$$ IMMUTABLE;


CREATE AGGREGATE avg_weighted(value numeric, weight numeric) (
    sfunc = avg_weighted_step, 
    stype = numeric[],
    finalfunc = avg_weighted_finalizer,
    initcond = '{0,0}' );

示例用法:

$ table tmp;
v  w 
-- -
 1 2
10 1
(2 rows)

$ select avg_weighted(v, w) from tmp;
   avg_weighted    
------------------
4.0000000000000000
(1 row)

$ select avg_weighted(v, w) from tmp where v is null;
avg_weighted 
------------
           ∅
(1 row)