IBM® Informix® 12.10

SUMSQ ユーザ定義集計関数

SUMSQ ユーザ定義集計関数は、各値を二乗し、これらの二乗値の合計を計算します。

アルゴリズムを次に示します。
x12 + x22 + ... 
ここで、各 xi は 1 つの列値、つまり 1 つの集計関数引数です。
SUMSQ の集計関数の状態を判別するには、集計関数の各反復実行時に使用可能である必要がある情報を調べます。SUMSQ を 1 回反復するために、ITER 関数は次の操作を実行する必要があります。
  1. 集計関数引数を二乗する。

    データベース サーバから集計関数引数が渡されているため、ITER 関数はこの引数を使用できます。したがって、ITER にはこのステップを実行するために追加情報を必要としません。

  2. これまでに二乗された値の部分合計に、二乗した引数を加算する。

    二乗した引数を加算するため、集計関数がこれまでの二乗値の部分合計を維持する必要があります。ITER 関数がこれまでの反復の部分合計を使用するには、集計関数の状態に部分合計が含まれている必要があります。

SUMSQ の状態は単純状態です。これは、部分合計のデータ型が、集計関数引数のデータ型と同一であるためです。例えば、SUMSQ 集計関数が整数 (INTEGER) 型値を受け取る場合は、この部分合計も整数 (INTEGER) 型です。したがって SUMSQ により、データベース サーバはこの状態を管理できます。これは、集計サポート関数の設計に次のように影響します。
  • INIT サポート関数は状態管理を実行する必要がありません。

    単純状態の集計関数では、集計関数の状態の割当てと割当て解除を明示的に処理する必要がありません。代わりに、データベース サーバが自動的に集計関数の状態を割り当て、NULL に初期化します。したがって、INIT 関数では他の INIT 関数タスク (表 1を参照) は不要です。つまり、集計定義からこのサポート関数を安全に省略できます。

  • COMBINE サポート関数は、その ITER 関数と同一の場合があります。

    2 つの部分状態をマージするために必要な特別な処理はありません。ITER 関数によりこのマージが適切に実行されます。

反復開始前に、部分合計をゼロに初期化しておく必要があります。 ただし、状態管理に INIT 関数は必要ではないため、この集計関数は ITER 関数を初めて呼び出すときに状態を初期化できます。ITER 関数は次に 1 つの集計関数引数の二乗を計算し、この値を部分合計に加算します。最後の反復に達した時点での最終部分合計は、SUMSQ 集計関数から戻される値です。したがって SUMSQ アルゴリズムでは、反復後処理タスクのための FINAL 関数は不要です。

次のコードに、SUMSQ ユーザ定義集計関数の整数 (INTEGER) 型引数を処理する必須集計サポート関数を示します。
/* SUMSQ ITER support function on INTEGER */
mi_integer iter_sumsq(state, value, fparam)
   mi_integer state;
   mi_integer value;
   MI_FPARAM *fparam;
{
   /* If 'state' is NULL, this is the first invocation. 
    * Just return square of 'value'.
    */
   if ( mi_fp_argisnull(fparam, 0) )
      return (value * value);
   else /* add 'state' and square of 'value' together */
      return (state + (value * value));
}

/* SUMSQ COMBINE support function on INTEGER */
mi_integer combine_sumsq(state1, state2)
   mi_integer state1, state2;
{
   /* Return the new partial sum from two parallel partial
    * sums
    */
   return (iter_sumsq(state1, state2));
}
次の SQL 文は、SUMSQ ユーザ定義集計関数をデータベースに登録します。
CREATE AGGREGATE sumsq
   WITH (ITER = iter_sumsq,
       COMBINE = combine_sumsq);

この CREATE AGGREGATE 文には、SUMSQ の実装に必要な集計サポート関数である ITER と COMBINE のみをリストします。

SUMSQ 集計関数の ITER および COMBINE 集計サポート関数はコンパイルされ、sumsq という名前の共有オブジェクト モジュールにリンクされるとします。

UNIX または Linux では、SUMSQ 集計サポート関数の実行可能コードは sumsq.so という共有ライブラリに格納されます。

次のコードに示す CREATE FUNCTION 文は、整数 (INTEGER) 型の集計関数引数を処理する SUMSQ の集計サポート関数を登録します。
CREATE FUNCTION iter_sumsq(state INTEGER, one_value INTEGER)
   RETURNS INTEGER
   WITH (HANDLESNULLS)
   EXTERNAL NAME '/usr/udrs/aggs/sums/sumsq.so'
   LANGUAGE C;

CREATE FUNCTION combine_sumsq(state1 INTEGER, state2 INTEGER)
   RETURNS INTEGER
   EXTERNAL NAME '/usr/udrs/aggs/sums/sumsq.so'
   LANGUAGE C;
tab1 表 (図 1 で定義される表) の場合、次に示す問合せでは、整数 (INTEGER) 型列であるcol3 に対して新規 SUMSQ 集計関数が使用されます。
SELECT SUMSQ(col3) FROM tab1;

上記の問合せは、図 1 により挿入された行から、整数 (INTEGER) 型値 2173 を算出します。他のデータ型に対して SUMSQ を使用できるようにするには、そのデータ型に対して適切な集計サポート関数が存在していることを確認する必要があります。


フィードバックの送信 | 例の共有 | トラブルシューティング

PDF を見つけるには、Publications for the IBM Informix 12.10 family of products を参照してください。
リリース ノート、ドキュメント ノート、マシン ノートについては、リリース ノート・ページを参照してください。
タイムスタンプ リリース日: 2013 年 3 月