ST_Collect - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

ST_Collect

ST_Collect 有兩個變體。一個接受兩個幾何,一個接受彙總運算式。

ST_Collect 的第一個變體會從輸入幾何建立幾何。會保留輸入幾何的順序。此變體的運作方式如下:

  • 如果兩個輸入幾何都是點,則傳回具有兩個點的 MULTIPOINT

  • 如果兩個輸入幾何都是 linestring,則傳回具有兩個 linestring 的 MULTILINESTRING

  • 如果兩個輸入幾何都是多邊形,則傳回具有兩個多邊形的 MULTIPOLYGON

  • 否則,會傳回具有兩個輸入幾何的 GEOMETRYCOLLECTION

ST_Collect 的第二個變體會根據幾何欄中的幾何建立幾何。幾何形狀沒有確定的傳回順序。指定 WITHIN GROUP (ORDER BY ...) 子句以指定傳回幾何的順序。此變體的運作方式如下:

  • 如果輸入彙總運算式中的所有非 NULL 列都是點,則傳回包含彙總運算式中所有點的多點。

  • 如果彙總運算式中的所有非 NULL 列都是 linestring,則會傳回包含彙總運算式中所有 linestring 的 multilinestring。

  • 如果彙總運算式中的所有非 NULL 列都是多邊形,則結果是傳回一個包含彙總運算式中所有多邊形的多重多邊形。

  • 否則,會傳回包含彙總運算式中所有幾何的 GEOMETRYCOLLECTION

ST_Collect 會傳回與輸入幾何相同維度的幾何。所有輸入幾何必須具有相同的維度。

語法

ST_Collect(geom1, geom2)
ST_Collect(aggregate_expression) [WITHIN GROUP (ORDER BY sort_expression1 [ASC | DESC] [, sort_expression2 [ASC | DESC] ...])]

引數

geom1

GEOMETRY 資料類型的值,或是評估為 GEOMETRY 類型的表達式。

geom2

GEOMETRY 資料類型的值,或是評估為 GEOMETRY 類型的表達式。

aggregate_expression

GEOMETRY 資料類型的欄,或是評估為 GEOMETRY 類型的運算式。

[WITHIN GROUP (ORDER BY sort_expression1 [ASC | DESC] [, sort_expression2 [ASC | DESC] ...])]

選用子句,指定彙總值的排序順序。ORDER BY 子句包含排序運算式的清單。排序運算式是類似於查詢選取清單中的有效排序運算式 (例如欄名稱) 的運算式。您可以指定遞增 (ASC) 或遞減 (DESC) 順序。預設值為 ASC

傳回類型

MULTIPOINTMULTILINESTRINGMULTIPOLYGONGEOMETRYCOLLECTION 子類型的 GEOMETRY

傳回幾何的空間參考系統識別碼 (SRID) 值是輸入幾何的 SRID 值。

如果 geom1geom2 為 null,則傳回 null。

如果 aggregate_expression 的所有列都為 null,則傳回 null。

如果 geom1 為 null,則傳回 geom2 的副本。同樣,如果 geom2 為 null,則傳回 geom1 的副本。

如果 geom1geom2 具有不同的 SRID 值,則會傳回錯誤。

如果 aggregate_expression 中的兩個幾何具有不同的 SRID 值,則會傳回錯誤。

如果傳回的幾何大於 GEOMETRY 的大小上限,則會傳回錯誤。

如果 geom1geom2 的維度不同,則傳回錯誤。

如果 aggregate_expression 中的兩個幾何具有不同的維度,則會傳回錯誤。

範例

下列 SQL 會傳回包含兩個輸入幾何的幾何集合。

SELECT ST_AsText(ST_Collect(ST_GeomFromText('LINESTRING(0 0,1 1)'), ST_GeomFromText('POLYGON((10 10,20 10,10 20,10 10))')));
st_astext ----------- GEOMETRYCOLLECTION(LINESTRING(0 0,1 1),POLYGON((10 10,20 10,10 20,10 10)))

下列 SQL 會將表格中的所有幾何圖形收集到幾何集合中。

WITH tbl(g) AS (SELECT ST_GeomFromText('POINT(1 2)', 4326) UNION ALL SELECT ST_GeomFromText('LINESTRING(0 0,10 0)', 4326) UNION ALL SELECT ST_GeomFromText('MULTIPOINT(13 4,8 5,4 4)', 4326) UNION ALL SELECT NULL::geometry UNION ALL SELECT ST_GeomFromText('POLYGON((0 0,10 0,0 10,0 0))', 4326)) SELECT ST_AsEWKT(ST_Collect(g)) FROM tbl;
st_astext ----------- SRID=4326;GEOMETRYCOLLECTION(POINT(1 2),LINESTRING(0 0,10 0),MULTIPOINT((13 4),(8 5),(4 4)),POLYGON((0 0,10 0,0 10,0 0)))

下列 SQL 會收集資料表中依 id 欄分組並依此 ID 排序的所有幾何。在此範例中,產生的幾何會依 ID 分組,如下所示:

  • id 1 – 多點中的點。

  • id 2 – multilinestring 中的 linestring。

  • id 3 – 幾何集合中的混合子類型。

  • id 4 – 多重多邊形中的多邊形。

  • id 5 – null,結果為 null。

WITH tbl(id, g) AS (SELECT 1, ST_GeomFromText('POINT(1 2)', 4326) UNION ALL SELECT 1, ST_GeomFromText('POINT(4 5)', 4326) UNION ALL SELECT 2, ST_GeomFromText('LINESTRING(0 0,10 0)', 4326) UNION ALL SELECT 2, ST_GeomFromText('LINESTRING(10 0,20 -5)', 4326) UNION ALL SELECT 3, ST_GeomFromText('MULTIPOINT(13 4,8 5,4 4)', 4326) UNION ALL SELECT 3, ST_GeomFromText('MULTILINESTRING((-1 -1,-2 -2),(-3 -3,-5 -5))', 4326) UNION ALL SELECT 4, ST_GeomFromText('POLYGON((0 0,10 0,0 10,0 0))', 4326) UNION ALL SELECT 4, ST_GeomFromText('POLYGON((20 20,20 30,30 20,20 20))', 4326) UNION ALL SELECT 1, NULL::geometry UNION ALL SELECT 2, NULL::geometry UNION ALL SELECT 5, NULL::geometry UNION ALL SELECT 5, NULL::geometry) SELECT id, ST_AsEWKT(ST_Collect(g)) FROM tbl GROUP BY id ORDER BY id;
id | st_asewkt ----+----------------------------------------------------------------------------------------------------------- 1 | SRID=4326;MULTIPOINT((1 2),(4 5)) 2 | SRID=4326;MULTILINESTRING((0 0,10 0),(10 0,20 -5)) 3 | SRID=4326;GEOMETRYCOLLECTION(MULTIPOINT((13 4),(8 5),(4 4)),MULTILINESTRING((-1 -1,-2 -2),(-3 -3,-5 -5))) 4 | SRID=4326;MULTIPOLYGON(((0 0,10 0,0 10,0 0)),((20 20,20 30,30 20,20 20))) 5 |

下列 SQL 會從幾何集合中的資料表收集所有幾何。結果會依 id 的遞減順序排序,然後根據它們的最小和最大 x 座標按字典順序排列。

WITH tbl(id, g) AS ( SELECT 1, ST_GeomFromText('POINT(4 5)', 4326) UNION ALL SELECT 1, ST_GeomFromText('POINT(1 2)', 4326) UNION ALL SELECT 2, ST_GeomFromText('LINESTRING(10 0,20 -5)', 4326) UNION ALL SELECT 2, ST_GeomFromText('LINESTRING(0 0,10 0)', 4326) UNION ALL SELECT 3, ST_GeomFromText('MULTIPOINT(13 4,8 5,4 4)', 4326) UNION ALL SELECT 3, ST_GeomFromText('MULTILINESTRING((-1 -1,-2 -2),(-3 -3,-5 -5))', 4326) UNION ALL SELECT 4, ST_GeomFromText('POLYGON((20 20,20 30,30 20,20 20))', 4326) UNION ALL SELECT 4, ST_GeomFromText('POLYGON((0 0,10 0,0 10,0 0))', 4326) UNION ALL SELECT 1, NULL::geometry UNION ALL SELECT 2, NULL::geometry UNION ALL SELECT 5, NULL::geometry UNION ALL SELECT 5, NULL::geometry) SELECT ST_AsEWKT(ST_Collect(g) WITHIN GROUP (ORDER BY id DESC, ST_XMin(g), ST_XMax(g))) FROM tbl;
st_asewkt --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- SRID=4326;GEOMETRYCOLLECTION(POLYGON((0 0,10 0,0 10,0 0)),POLYGON((20 20,20 30,30 20,20 20)),MULTILINESTRING((-1 -1,-2 -2),(-3 -3,-5 -5)),MULTIPOINT((13 4),(8 5),(4 4)),LINESTRING(0 0,10 0),LINESTRING(10 0,20 -5),POINT(1 2),POINT(4 5)