sum()
関数の代わりに使用するために、PostgreSQL で新しい集計関数を作成しようとしています。
ここでマニュアルの旅を始めました。
倍精度値の配列を取り、それらを合計してから追加の計算を行う関数を作成したかったので、最初にその最終関数を作成しました。
takes double precision as input and gives double precision as output
DECLARE
v double precision;
BEGIN
IF tax > 256 THEN
v := 256;
ELSE
v := tax;
END IF;
RETURN v*0.21/0.79;
END;
次に、倍精度値の配列を取り、前の関数が処理する単一の倍精度値を出力する集計関数を作成したいと考えました。
CREATE AGGREGATE aggregate_ee_income_tax (float8[]) (
sfunc = array_agg
,stype = float8
,initcond = '{}'
,finalfunc = eeincometax);
そのコマンドを実行すると得られるものは次のとおりです。
エラー: 関数 array_agg(double precision, double precision[]) は存在しません
マニュアルにはarray_agg()が既存の関数としてリストされているため、ここで行き詰まっています。私は何を間違っていますか?
また、実行すると:
\da
List of aggregate functions
Schema | Name | Result data type | Argument data types | Description
--------+------+------------------+---------------------+-------------
(0 rows)
私のインストールには集計関数がまったくありませんか? または、ユーザー定義関数のみをリストしますか?
基本的に私が理解しようとしていること:
1) 既存の関数を使用して配列値を合計できますか?
2) 関数の入力データ型と出力データ型を調べるにはどうすればよいですか? array_agg()
あらゆる種類の入力を受け取るDocs クレーム。
3) 独自の集計関数の何が問題になっていますか?
編集 1
私が達成しようとしていることのより多くの情報とより明確なイメージを与えるために:
次のようないくつかのテーブルに対する1つの巨大なクエリがあります。
SELECT sum(tax) ... from (SUBQUERY) as foo group by id
その合計関数を独自の集計関数に置き換えたいので、バックエンドで追加の計算を行う必要はありません。それらはすべてデータベース レベルで実行できるためです。
編集 2
アリの答えを受け入れました。最終的な解決策はコメントから得られるため、参照用にここに投稿します。
CREATE AGGREGATE aggregate_ee_income_tax (float8)
(
sfunc = float8pl
,stype = float8
,initcond = '0.0'
,finalfunc = eeincometax
);