CREATE AGGREGATE

Name

CREATE AGGREGATE  --  新しい集約関数を定義する。

Synopsis

CREATE AGGREGATE name ( BASETYPE = input_data_type
    [ , SFUNC1 = sfunc1, STYPE1 = state1_type ]
    [ , SFUNC2 = sfunc2, STYPE2 = state2_type ]
    [ , FINALFUNC = ffunc ]
    [ , INITCOND1 = initial_condition1 ]
    [ , INITCOND2 = initial_condition2 ] )
  

入力

name

作成する集約関数名。

input_data_type

この集約関数が操作対象とする、入力データ型。

sfunc1

全ての非 NULL 入力データ値に対して呼び出される、状態遷移 関数。 この関数は、1 番目が state1_type 型、2 番目が input_data_type 型という2 つの引数を取らなければなりません。 またこの関数は、 state1_type 型の値を返さなければなりません。 この関数は、現在の状態値 1 と現在の入力データ項目を取り、 次の状態値 1 を返すものです。

state1_type

この集約の 1 番目の状態値用の型。

sfunc2

全ての非 NULL 入力データ値に対して呼び出される、状態遷移 関数。 この関数は、 state2_type 型の引数を1 つ取り、同じ型の値を返さなければなりません。 この関数は、現在の状態値 2 を取り、次の状態値 2 を返すも のです。

state2_type

この集約の 2 番目の状態値のデータ型。

ffunc

全ての入力データを遷移させた後に、この集約の結果を計算す るために呼び出される最終関数。 状態値の両方が使用される場合、この最終関数は、 state1_type 型と state2_type. 型の引数を取らなければなりません。 状態値の片方のみが使用される場合、この最終関数は、 使用する状態値の型の引数を1つのみ取らなければなりません。 この集約の出力データ型は、この関数の戻り値の型として 定義されます。

initial_condition1

状態値 1 用の初期値。

initial_condition2

状態値 2 用の初期値。

出力

CREATE

コマンドの実行に成功した時に返されるメッセージ。

説明

CREATE AGGREGATE を使用して、ユーザまたはプログラマは、新しい集約関数を 定義することによって、 Postgres の機能を拡張するこ とができます。 基本配布物内で min(int4)avg(float8) といった、いくつかの基 本型用の集約関数が用意されています。 新しい型を定義した場合や、必要な集約関数が用意されていな かった場合、CREATE AGGREGATE を使用し て、希望する機能を用意することができます。

集約関数はその名前と入力データ型によって識別されます。 異なる入力型に対して操作を行なう 2 つの集約は同じ名前を 持つことができます。 混乱を防ぐために、ある集約と同じ名前と入力データ型をも つ通常の関数を作成しないで下さい。

集約関数は、 sfunc1、及び、 sfunc2 という 2つの状態遷移関数と ffunc という 最終計算関数という 1 つから 3 つの通常の関数からなります。 これらは次のように使用されます。

sfunc1( 内部状態 1, 次のデータ項目 ) ---> 次の内部状態 1 
sfunc2( 内部状態 2 ) ---> 次の内部状態 2 
ffunc(内部状態 1 , 内部状態 2) ---> 集約の値
   

Postgres は、集約の内部状態の 現在値を保持するために、( stype1 デー タ型のみ、もしくは、この型と stype2データ 型の) 1 つもしくは 2 つの中間変数を作成します。 各入力データ項目に対し、(複数の)状態遷移関数が、この内部 状態の新しい値を計算するために呼び出されます。 全てのデータが処理された後、集約の出力値を計算するために、 最終関数が一度呼び出されます。

両方の状態遷移関数が指定された場合、 ffunc が指定さ れなければなりません。 片方のみの状態遷移関数が使用される場合は、 ffunc は省略す ることができます。 ffunc が用意さ れない場合のデフォルトの動作は、使用してきた内部用状態値の 最終値を返すことです。(そして、これにより、集約の出力型はそ の状態値の型と同一になります。)

また、集約関数は 1 つまたは 2 つの初期条件、つまり、使用され る内部用状態値の初期値、を用意することもできます。 これらは text 型のフィールドとして指定され、デー タベース内に保存されます。しかし、このフィールドは状態値データ 型の定数として、有効な外部表現である必要があります。 initcond1 無しに sfunc1 を指定した 場合、システムは最初の入力項目に対して sfunc1 を呼び出さ ずに、内部用状態変数 1 をその最初の入力項目で初期化します。 その後、2 番目の入力項目から sfunc1 が呼び出さ れます。 これは、MIN や MAX といった集約に有用です。 この機能を使用する集約は、入力値無しで呼び出された場合 NULL を 返すことに注意して下さい。 状態値 2 には同等の機能は用意されていません。 sfunc2 を指定する 場合 initcond2 は 必須です。

注意

集約関数を削除する場合は DROP AGGREGATE を使用して下さい。

CREATE AGGREGATE のパラメータは、 上で示した順番だけではなく、任意の順番で書くことが できます。

様々な組合せの状態関数と最終関数を持つ集約関数を指定す ることができます。 例えば、count 集約では、 sfunc2 (増加させる関数) が必要ですが sfunc1ffunc を 必要としません。 一方、sum 集約では、 sfunc1 (加算関数) が必要ですが、 sfunc2ffunc を 必要としません。 そして、avg 集約では、その解を作る ために ffunc (除算関数) はもちろん、両方の状態関数が必要です。 どの場合でも、少なくとも 1 つの状態関数の定義が必要であ り、全ての sfunc2 は対 応する initcond2 を持つ必要があります。

使用法

使用法に関する完全な例については PostgreSQL プログラマガイド の集 約関数の章を参照して下さい。

互換性

SQL92

CREATE AGGREGATEPostgres の拡張言語です。 SQL92 には CREATE AGGREGATE はありません。