この例は、UDFテーブルへの入力をソートさせるためのHASH BY句およびLOCAL ORDER BY句の使用を示しています。
一部のアプリケーションでは、UDFテーブルへの入力を順序付けしなければならないことがあります。入力引数をアプリケーションやUDFテーブルで整列するのではなく、SELECTリクエストのFROM句でUDFテーブルを呼び出すときに、HASH BY句およびLOCAL ORDER BY句を指定することができます。入力の有効範囲には、派生テーブル、ビューおよびWITHオブジェクトが含まれます。
次のテーブル定義があるとします。
CREATE TABLE tempdata ( tid INTEGER, tts TIMESTAMP, x INTEGER, y INTEGER);
tempdataのデータが次のようなものと仮定します。
tid --- |
tts --- |
x - |
y - |
---|---|---|---|
1001 | '2008-02-03 14:33:15' | 10 | 11 |
1001 | '2008-02-03 14:44:20' | 20 | 24 |
1001 | '2008-02-03 14:59:08' | 31 | 30 |
1002 | '2008-02-04 11:02:19' | 10 | 11 |
1002 | '2008-02-04 11:33:04' | 22 | 18 |
1002 | '2008-02-04 11:48:27' | 29 | 29 |
ここで、char_from_rowsというUDFテーブルについて考えてみます。このUDFテーブルでは、xに同じ値を持つ行に含まれるタイムスタンプ、yおよびtidの値をすべて表わすテキスト文字列を生成します。さらに、このテキスト文字列の値は、タイムスタンプで順序付けされます。このUDFテーブルの定義は、次のようになります。
CREATE FUNCTION char_from_rows(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;
次に示す文では、char_from_rowsUDFテーブルを呼び出します。ここでは、非再帰的なWITH句を使用してtidで入力をハッシュし、各AMPに対する入力をttsの値順にしています。
WITH wq (tID1, tTS1, x1, y1) AS (SELECT tID, tTS, x, y FROM tempData) SELECT * FROM TABLE (char_from_rows(wq.tID1, wq.tTS1, wq.x1, wq.y1) HASH BY tID1 LOCAL ORDER BY tTS1) AS 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