例: 同じ文内のHASH BY句とLOCAL ORDER BY句 - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ操作言語

Product
Advanced SQL Engine
Teradata Database
Release Number
17.05
Published
2021年1月
Language
日本語
Last Update
2021-03-30
dita:mapPath
ja-JP/vnq1596660420420.ditamap
dita:ditavalPath
ja-JP/vnq1596660420420.ditaval
dita:id
B035-1146
Product Category
Software
Teradata Vantage

この例は、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