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'中使用子查詢來計算一次輸入表達式。 –