我正在使用Amazon RDS Postgres数据库(9.4.4),我想计算一些数据的加权平均值。
我发现以下扩展名看起来非常适合这项工作。 https://github.com/Kozea/weighted_mean
但是我现在不确定如何安装扩展程序,因为我的初步研究显示只有“支持”#允许扩展。
使用此扩展程序有哪些选项。我不想重新发明轮子,我不熟悉在Postgres中安装任何类型的功能/扩展。
由于
答案 0 :(得分:7)
为什么你不发出这样的简单查询:
for item in chain.from_iterable([list1,list2,list3]):
print(item)
当然你需要改变你的领域(单位价格,数量)
答案 1 :(得分:2)
要注册新的自定义扩展,您需要在Postgres安装的contrib
目录中添加适当的脚本。 AWS 不允许您拥有如此精细的控件。
简而言之,您无法添加任何自定义扩展程序(除了您提供的link或pg_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)