アプリケーションによっては、UDFテーブルに対して入力の整列が必要なものがあります。アプリケーションまたはUDFテーブルのあらゆる種類の入力引数を処理するのではなく、UDFテーブルをSELECT文のFROM句で呼び出すときにHASH BYおよびLOCAL ORDER BY句を使用できます。入力のスコープには、派生テーブル、ビュー、およびWITHオブジェクトが含まれます。
次のテーブル定義があるとします。
CREATE TABLE tempData(tID INTEGER, tTS TIMESTAMP, x INTEGER, y INTEGER);
テーブルにあるデータは次のようになっていると仮定します。
INSERT INTO tempData VALUES (1001, TIMESTAMP '2008-02-03 14:33:15', 10, 11); INSERT INTO tempData VALUES (1001, TIMESTAMP '2008-02-03 14:44:20', 20, 24); INSERT INTO tempData VALUES (1001, TIMESTAMP '2008-02-03 14:59:08', 31, 30); INSERT INTO tempData VALUES (1002, TIMESTAMP '2008-02-04 11:02:19', 10, 11); INSERT INTO tempData VALUES (1002, TIMESTAMP '2008-02-04 11:33:04', 22, 18); INSERT INTO tempData VALUES (1002, TIMESTAMP '2008-02-04 11:48:27', 29, 29);
CharFromRowsと呼ばれるUDFテーブルについて見てみましょう。このUDFが生成する文字列には、timestamp、x、およびyのすべての値が表されており、tID列と同じ値を持っています。さらに、テキスト文字列に表現された値は、timestampにより整列されています。以下は、UDFテーブルの定義を示しています。
CREATE FUNCTION CharFromRows(tID INTEGER, tTS TIMESTAMP, x INTEGER, y INTEGER) RETURNS TABLE(outID INTEGER, outCHAR VARCHAR(64000)) LANGUAGE C NO SQL EXTERNAL NAME 'CS!charfromrows!udfsrc/charfromrows.c' PARAMETER STYLE SQL;
次のクエリーは、CharFromRowsのテーブルUDFを起動し、再帰的でないWITH句を使用し、tIDをキーにして入力のハッシュを作成します。また、tTSをキーにして値の整列を行ない、AMPへ入力します。
WITH wq (tID1, tTS1, x1, y1) AS (SELECT tID, tTS, x, y FROM tempData) SELECT * FROM TABLE (CharFromRows(wq.tID1, wq.tTS1, wq.x1, wq.y1) HASH BY tID1 LOCAL ORDER BY tTS1) tudf;
出力は次のようになります。
outID outCHAR ----- --------------------------------------------------------------------- 1001 2008-02-03 14:33:1510112008-02-03 14:44:2020242008-02-03 14:59:083130 1002 2008-02-04 11:02:1910112008-02-04 11:33:0422182008-02-04 11:48:272929
HASH BY句およびLOCAL ORDER BY句の詳細については、<Teradata Vantage™- SQLデータ定義言語 - 詳細トピック、B035-1184>の「FROM TABLE」を参照してください。