17.00 - 17.05 - ウィンドウ集約UDFの基本アルゴリズム - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQL外部ルーチン プログラミング

Product
Advanced SQL Engine
Teradata Database
Release Number
17.00
17.05
Published
2020年6月
Content Type
プログラミング リファレンス
Publication ID
B035-1147-170K-JPN
Language
日本語 (日本)

あるグループに対するウィンドウ集約UDFの処理フローは、次のテーブルに示すとおりです。

フェーズ phase.getPhase()の値 説明
1 Phase.AGR_INIT このフェーズは、新しい集約グループまたは最初の行の開始時に、パーティションごとに一度だけトリガーされます。
メソッドでは、次のことを実行する必要があります。
  • 中間記憶域を割り当て、初期設定する。
  • メソッドに渡された最初の詳細データを処理する。
2 Phase.AGR_DETAIL このフェーズは、行が前進する度にトリガーされます。

Teradata Databaseにより、各グループごとに、集約の対象となる行ごとに1回ずつメソッドが呼び出されます。

メソッドでは、UDFの引数入力データと、そのグループに対して定義されている中間記憶域を結合する必要があります。

3 Phase.AGR_MOVINGTRAIL このフェーズは、移動ウィンドウ タイプ(非累積/非レポート ウィンドウ タイプ)に適用します。

このフェーズは、ウィンドウを指す前進ポインタがグループの終端またはファイルの終端に到達したときに、移動ウィンドウの最後の数行によってのみトリガーされます。

このフェーズはメソッドに行も値も提供せず、主にグループまたはファイルの終端に到達しつつあることをメソッドに表示するために使用されます。

メソッドは、ウィンドウがグループやファイルの終端方向に縮小するのに応じて、実際のサイズを反映するように必要な内部カウントまたは関連する値を調整するために、このフェーズを使用します。

4 Phase.AGR_FINAL このフェーズは、最終的に評価された結果を結果行に移動する必要が生じたときに、呼び出されます。

グループが予期する入力はもはやなくなり、メソッドはグループの最終結果を生成します。

5 Phase.AGR_NODATA このフェーズが関係してくるのは、集約するデータが何もない場合だけです。

Phase.AGR_COMBINEフェーズはウィンドウ集約UDFには適用しません。

ウィンドウ集約関数を呼び出す前に、FNC_Context_tの以下のフィールドがTeradata Databaseにより設定されます。
  • pre_windowサイズ: この値はPRECEDING句の一部として指定されます。現在の行より前の行をポイントしている場合、このフィールドの値は負になります。このフィールドは、累積ウィンドウとレポート ウィンドウのタイプには適用しません。その場合、このフィールドは0に初期化されます。
  • post_windowサイズ: この値はFOLLOWING句の一部として指定されます。現在の行より前の行をポイントしている場合、このフィールドの値は負になります。このフィールドは、累積ウィンドウとレポート ウィンドウのタイプには適用しません。その場合、このフィールドは0に初期化されます。
  • window_size: 累積ウィンドウ タイプでは、この値は-1になります。レポート ウィンドウ タイプでは、この値は-2になります。通常ウィンドウ タイプでは、この値は「post_windowサイズ -pre_windowサイズ+1」になります(+1は、現在の行の分)。

ウィンドウのサイズに応じた、行のキャッシュを維持する必要があります。このキャッシュは、これまでに読み取った行の合計を示すカウンタ値の保守に役立ちます。例えば、Cがカウンタを表わすとすると、評価対象の行のウィンドウは次のようになります。

if (C < window_size),
   window size would be C
else
   window size would be as indicated in function context.

ウィンドウの起点はC - window_sizeになり、ウィンドウの終端はCと同じになります。各種のウィンドウの組み合わせ(PRECEDING/FOLLOWING/CURRENTなど)に関わる複雑性は、Teradata Databaseによって処理されます。ユーザーに必要なことは、行のウィンドウ キャッシュを保守し、この行のキャッシュに対する関数のセマンティクスを実装するだけです。

ウィンドウ集約関数を実行するJavaコードのサンプルについては、Javaウィンドウ集約関数を参照してください。