CREATE AGGREGATE

Name

CREATE AGGREGATE  -- 新しい集約関数の定義

Synopsis

CREATE AGGREGATE name ( BASETYPE = input_data_type,
    SFUNC = sfunc, STYPE = state_type
    [ , FINALFUNC = ffunc ]
    [ , INITCOND = initial_condition ] )
  

入力

name

作成する集約関数の名前です (オプションでスキーマ修飾名)。

input_data_type

この集約関数が演算する入力データ型です。 これは、入力値を検査しない集約には "ANY" として指定することができます (たとえば count(*))。

sfunc

それぞれの入力データ値に呼び出される状態遷移関数の名前です。これは通常は 2 つの引数を持ち、最初の引数は state_type 型で 2 番目は input_data_type型です。代わりに、入力値を検査しない集約ではこの関数は state_type 型の引数を1つだけとります。どちらの場合でも、この関数は state_type 型の値を返さなければなりません。この関数は現在の状態値と現在の入力データ項目を受け取り、次の状態値を返します。

state_type

集約の状態値のデータ型です。

ffunc

すべての入力データを検索し終わってから集約の結果を計算するために呼ばれる最後の関数の名前です。関数は state_type 型の引数を 1 つとらなくてはいけません。集約の出力データ型はこの関数の返り値として定義されます。ffunc が指定されない場合には、終了状態値が集約の結果として使われ、出力型は state_type になります。

initial_condition

状態値の初期設定です。これはデータ型 state_type として受け入れられるリテラル定数でなければいけません。もし指定されないと、状態値は NULL として始まります。

出力

CREATE AGGREGATE

コマンドが問題なく処理された場合に返されるメッセージです。

説明

CREATE AGGREGATE は、ユーザやプログラマが新しい集約関数を定義することで PostgreSQL の機能性を拡張することを可能にします。min(integer)avg(double precision) のような基本型の集約関数はすでに基本配布物の中で提供されています。もし新しい型を定義するかまだ提供されていない集約関数が必要な場合、必要な機能を提供するために CREATE AGGREGATE を使うことができます。

スキーマ名が付けられている場合 (たとえば、CREATE AGGREGATE myschema.myagg ...)、集約関数は指定されたスキーマで作成されます。 スキーマ名がなければ、集約関数は現在のスキーマ (検索パスの前にあるスキーマ。CURRENT_SCHEMA() 参照) で作成されます。

集約関数は名前と入力データ型によって識別されます。 異なる入力型の演算をするのであれば、同じスキーマ内の 2 つの集約が同じ名前であっても構いません。 集約の名前および入力データ型は、同じスキーマ内のすべての通常の関数の名前および入力データ型とも、違うものにする必要があります。

集約関数は 1 つか 2 つの通常の関数から作られます。状態遷移関数 sfunc と省略可能な最終計算関数 ffunc です。これらは以下のように使われます。

sfunc( internal-state, next-data-item ) ---> next-internal-state
ffunc( internal-state ) ---> aggregate-value
   

PostgreSQL は、集約の現在の内部状態を保持する、stypeデータ型の一時変数を作成します。それぞれの入力データ項目で、状態遷移関数は新しい内部状態値を計算するために呼び出されます。すべてのデータが処理されると、最終関数が集約の出力値を計算するために 1 回呼び出されます。もし最終関数がなければ終了状態値がそのまま返されます。

集約関数は、内部状態値のための初期値である、初期状態を提供することができます。これは text 型のフィールドとして指定されてデータベースに格納されますが、状態値データ型の定数として有効な外部表現でなければいけません。もし初期状態が供給されないと、NULL として始まります。

もし状態遷移関数が "厳格" と宣言されると、NULL 入力で呼び出すことはできません。そのような遷移関数では、集約の実行は以下のようになります。NULL 入力値が無視されます(その関数は呼び出されず前の状態値が持存します)。もし初期状態値が NULL だと、最初の非 NULL 入力値が状態値を置き換え、遷移関数は 2 番目の非 NULL 入力値から呼び出しが始まります。これは max のような集約の実装には便利です。このような動作は state_typeinput_data_type と同じときにのみ有効になります。これらの型が異なるときは、非 NULL 初期値を供給するか厳格でない遷移関数を使わなければいけません。

状態遷移関数が厳格ではない場合、それぞれの入力値で無条件に呼び出され、NULL 入力とNULL 遷移値を自分で処理しなければいけません。 これは、集約の作成者が、集約の NULL 値の扱いについて完全に管理することを可能にします。

もし最終関数が "厳格" と宣言されると、終了状態値が NULL の場合には呼び出されません。代わりに NULL という結果が自動的に出力になります。(もちろんこれは厳格な関数のただ一般的な動作でしかありません。)どのような場合でも最終関数は NULL を返すことができます。たとえば、avg の最終関数は入力タプルが 0 だとわかると NULL を返します。

注釈

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

CREATE AGGREGATE のパラメータは、上記で示されるものだけではなくどのような順番で書かれても構いません。

使用方法

使用方法の完全な例は PostgreSQL プログラマガイド の集約関数の章を参照してください。

互換性

SQL92

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