17.10 - 例: AggGeom - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - 地理空間データ型

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Release Date
2021年7月
Content Type
プログラミング リファレンス
Publication ID
B035-1181-171K-JPN
Language
日本語 (日本)

AggGeomを使用して、パーティション値(またはリスト)ごとに集約できます。この例では、ジオメトリの合併をジップ・コードごとに集約する処理を実行します。ジップ コード列でPARTITION BY句によりAggGeomを呼び出すと、すべての行がジップ コードにより再分散され、ジップ コードごとに1つの出力行を返します。

CREATE TABLE geom_table(pkey integer, zipcode CHAR(5), geom
ST_Geometry);

INSERT INTO geom_table VALUES(
 0, '92127', new ST_Geometry('LineString(10 10, 20 20)'));
INSERT INTO geom_table VALUES(
 1, '92127', new ST_Geometry('LineString(20 20, 30 30, 40 5)'));
INSERT INTO geom_table VALUES(
 2, '90338', new ST_Geometry('LineString(40 5, 50 50)'));

SELECT zipcode, geom
FROM AggGeom( ON (
  SELECT geom, zipcode
  FROM geom_table)
PARTITION BY zipcode
USING Operation('Union') ) L;

zipcode geom
------- -------------------------------------------------------------
90338   LINESTRING (40 5,50 50)
92127   MULTILINESTRING ((20 20,30 30,40 5),(10 10,20 20))

この2番目の例では、ローカル集約と最後のグローバル集約を使用して、すべてのジオメトリ値を集約します。

すべての入力ジオメトリ値の1つの集約を実行する文で、AggGeom演算子を2回呼び出すことができます。PARTITION BY句なしのSQLでAggGeomを一度呼び出すと、AggGeomはローカル集約を各AMPで実行し、各AMPから1つの行が返されます。

すべてのAMPから最終的な合併を実行するには、AggGeomへの2番目の呼び出しを入れ子にします。AggGeomへの内部呼び出しはローカル集約を各AMPで実行し、外部呼び出しはそのローカル集約の最終的な集約を実行して、すべてのジオメトリの合併を表わす1つの結果行を生成します。

Partition BY句を定数値とともに使用して、最終的な集約を1つのAMPで実行します。数値1のような定数値を指定することで、各AMPからローカルで集約された行は同じパーティションに含まれるため、最終的な集約で同じAMPに再分散されます。1つの出力行が返されます。

AggGeomへの1回の呼び出しを使用し、定数値ごとにパーティション化することで、すべての値を集約することもできますが、この場合すべての行を1つのAMPに再分散して集約を実行します。これは、Vantageの並列処理機能を活用しません。AggGeomへの2回の呼び出しによって、すべてのAMPはローカル集約を並行して実行し、最終の集約のみが1つのAMPで実行されます。

CREATE TABLE geom_table(pkey integer,
                        zipcode CHAR(5),
                        geom ST_Geometry);

INSERT INTO geom_table VALUES(
 0, '92127', new ST_Geometry('LineString(10 10, 20 20)'));
INSERT INTO geom_table VALUES(
 1, '92127', new ST_Geometry('LineString(20 20, 30 30, 40 5)'));
INSERT INTO geom_table VALUES(
 2, '90338', new ST_Geometry('LineString(40 5, 50 50)'));

SELECT *
FROM AggGeom( ON (
  SELECT L.*, 1 as p from AggGeom( ON (
    SELECT geom from geom_table)
USING Operation('Union') ) L)
PARTITION BY p
) G;

geom
----------------------------------------------------------------
MULTILINESTRING ((40 5,50 50),(20 20,30 30,40 5),(10 10,20 20))