0
我经常会用相同的聚合函数组合来查询。例如。如何重用PostgreSQL中的聚合表达式而不会减速
SELECT
my_id,
sum(a * weight)/nullif(sum(CASE WHEN a IS NOT NULL THEN weight END), 0) AS a,
sum(b * weight)/nullif(sum(CASE WHEN b IS NOT NULL THEN weight END), 0) AS b
FROM my_table
GROUP BY my_id
我想避免重复相同的表达式一遍又一遍。这将是巨大的一项新功能weighted_avg
得到相同的结果:
SELECT
my_id,
weighted_avg(a, weight) AS a,
weighted_avg(b, weight) AS b
FROM my_table
GROUP BY my_id
要做到这一点,我知道的唯一方法,就是使用CREATE AGGREGATE
与中间状态和SFUNC
它被调用的每一行。不幸的是,这比原来的查询慢得多,这使得它在我的情况下不可用。
我想象我的理想的解决方案会是什么样子
CREATE AGGREGATE FUNCTION weighted_avg(x float, weight float)
RETURNS float AS $$
SELECT sum(x * weight)/nullif(sum(CASE WHEN x IS NOT NULL THEN weight END), 0)
$$ language SQL IMMUTABLE;
和执行查询时会内联。但是我找不到Postgres支持的任何类似内容。
使用功能的大概总是要有点比在原始代码中使用表达式慢。 –
我对一些开销很满意,但是使用'CREATE AGGREGATE'的plpgsql实现需要4倍的时间才能执行。所以我会保留原始表达式,这是可以接受的,但我希望有更好的解决方案。 –
在'FROM'中使用子查询来计算一次输入表达式。 –