同じ集約関数の組み合わせを使用するクエリが頻繁にあります。例えば。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'のサブクエリを使用して、入力式を1回計算します。 –