CREATE AGGREGATE name ( BASETYPE = input_data_type, SFUNC = sfunc, STYPE = state_type [ , FINALFUNC = ffunc ] [ , INITCOND = initial_condition ] )
作成する集約関数の名前です。
この集約関数が演算する入力データ型です。 これは、入力値を検査しない集約には ANY として指定する ことができます(例としてはcount(*) があります)。
それぞれの入力データ値に呼び出される状態遷移関数 の名前です。これは通常は二つの引数を持ち、最初の引数は state_type 型で二番目は input_data_type 型です。代わりに、入力値を検査しない集約にはこの関数は state_type型の 引数を一つだけとります。どちらの場合でも、この関数は state_type 型の値を返さなければなりません。この関数は現在の状態値 と現在の入力データ項目を受け取り、次の状態値を 返します。
集約の状態値のデータ型です。
全ての入力データを検索し終ってから集約の結果を計算 するために呼ばれる最後の関数の名前です。その関数は state_type 型の引数を一つとらなくてはいけません。集約の出力データ型 はこの関数の返り値として定義されます。もし ffunc が 指定されないと、終了状態値が集約の結果として使われ、 出力型は state_type になります。
状態値の初期設定です。これはデータ型 state_type として受け入れられるリテラル定数でなければいけません。 もし指定されないと、状態値は NULL として始まります。
CREATE AGGREGATE はユーザかプログラマが 新しい集約関数を定義することで Postgres の機能性を拡張することを可能にします。min(integer) や avg(double precision) のような基本型 の集約関数は既に基本配布物の中で提供されています。もし 新しい型を定義するかまだ提供されていない集約関数が必要な場合、 必要な機能を提供するために CREATE AGGREGATE を使うことができます。
集約関数は名前と入力データ型によって識別されます。二つの 集約が異なる入力型の演算をする場合は同じ名前でも構いません。 混乱を避けるために、一般的な関数を同じ名前で作り入力データ型 を集約にはしないで下さい。
集約関数は一つか二つの一般的な関数から作られます。 状態遷移関数 sfunc とオプションの最終計算関数 ffuncです。 これらは以下のように使われます。
sfunc( internal-state, next-data-item ) ---> next-internal-state ffunc( internal-state ) ---> aggregate-value
Postgres は集約の現在の内部状態 を保持するデータ型の一時変数 stype を作成 します。それぞれの入力データアイテムで、状態遷移巻数は 新しい内部状態値を計算するために呼び出されます。全ての データが処理されると、最後の関数は集約の出力値を計算するために 一度呼び出されます。もし最後の関数がなければ終了状態値が そのまま返されます。
集約関数は、内部状態値のための初期値である、初期状態を提供 することができます。これは text 型のフィールド として指定されデータベースに格納されますが、状態値データ型 の定数の有効な外部表現でなければなりません。もしそれが供給 されないと、状態値は NULL として始まります。
もし状態遷移関数が pg_proc で "厳格" と宣言されると、 NULL 入力で呼び出すことはできません。そのような遷移関数 では、集約の実行は以下のようになります。NULL 入力値 が無視されます(その関数は呼び出されず前の状態値が 保持されます)。もし初期状態値が NULL だと、最初の 非 NULL 入力値が状態値を置き換え、遷移関数は二番目の 非 NULL 入力値から呼び出しが始まります。 これは maxのような集約の 実装には便利です。このような動作は state_type が input_data_type と同じときにのみ有効になります。これらの型が異なる時は、 非 NULL 初期値を供給するか非厳格な遷移関数を使わなければ なりません。
もし状態遷移関数が厳格ではない場合、それぞれの入力値で 無条件に呼び出され、NULL 入力と NULL 遷移値を自分で 処理しなければなりません。これは集約の著者が集約の NULL の 扱いについて完全に管理することを可能にします。
もし最後の関数が "厳格" として宣言されると、終了状態値が NULL の場合呼び出されません。代わりに NULL の結果が自動的に出力に なります。(もちろんこれは厳格な関数のただ一般的な動作でしか ありません。)どのような場合でも最後の関数は NULL を返す 選択があります。例えば、avg の最後の関数は 入力タプルがゼロだとわかると NULL を返します。