

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊，請參閱[部落格文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

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

# ST\$1Collect
<a name="ST_Collect-function"></a>

ST\$1Collect 有兩個變體。一個接受兩個幾何，一個接受彙總運算式。

ST\$1Collect 的第一個變體會從輸入幾何建立幾何。會保留輸入幾何的順序。此變體的運作方式如下：
+ 如果兩個輸入幾何都是點，則傳回具有兩個點的 `MULTIPOINT`。
+ 如果兩個輸入幾何都是 linestring，則傳回具有兩個 linestring 的 `MULTILINESTRING`。
+ 如果兩個輸入幾何都是多邊形，則傳回具有兩個多邊形的 `MULTIPOLYGON`。
+ 否則，會傳回具有兩個輸入幾何的 `GEOMETRYCOLLECTION`。

ST\$1Collect 的第二個變體會根據幾何欄中的幾何建立幾何。幾何形狀沒有確定的傳回順序。指定 WITHIN GROUP (ORDER BY ...) 子句以指定傳回幾何的順序。此變體的運作方式如下：
+ 如果輸入彙總運算式中的所有非 NULL 列都是點，則傳回包含彙總運算式中所有點的多點。
+ 如果彙總運算式中的所有非 NULL 列都是 linestring，則會傳回包含彙總運算式中所有 linestring 的 multilinestring。
+ 如果彙總運算式中的所有非 NULL 列都是多邊形，則結果是傳回一個包含彙總運算式中所有多邊形的多重多邊形。
+ 否則，會傳回包含彙總運算式中所有幾何的 `GEOMETRYCOLLECTION`。

ST\$1Collect 會傳回與輸入幾何相同維度的幾何。所有輸入幾何必須具有相同的維度。

## 語法
<a name="ST_Collect-function-syntax"></a>

```
ST_Collect(geom1, geom2)
```

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

## 引數
<a name="ST_Collect-function-arguments"></a>

 *geom1*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *geom2*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *aggregate\$1expression*   
`GEOMETRY` 資料類型的欄，或是評估為 `GEOMETRY` 類型的運算式。

 [WITHIN GROUP (ORDER BY *sort\$1expression1* [ASC \$1 DESC] [, *sort\$1expression2* [ASC \$1 DESC] ...])]   
選用子句，指定彙總值的排序順序。ORDER BY 子句包含排序運算式的清單。排序運算式是類似於查詢選取清單中的有效排序運算式 (例如欄名稱) 的運算式。您可以指定遞增 (`ASC`) 或遞減 (`DESC`) 順序。預設值為 `ASC`。

## 傳回類型
<a name="ST_Collect-function-return"></a>

`MULTIPOINT`、`MULTILINESTRING`、`MULTIPOLYGON` 或 `GEOMETRYCOLLECTION` 子類型的 `GEOMETRY`。

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

如果 *geom1* 或 *geom2* 為 null，則傳回 null。

如果 *aggregate\$1expression* 的所有列都為 null，則傳回 null。

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

如果 *geom1* 和 *geom2* 具有不同的 SRID 值，則會傳回錯誤。

如果 *aggregate\$1expression* 中的兩個幾何具有不同的 SRID 值，則會傳回錯誤。

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

如果 *geom1* 和 *geom2* 的維度不同，則傳回錯誤。

如果 *aggregate\$1expression* 中的兩個幾何具有不同的維度，則會傳回錯誤。

## 範例
<a name="ST_Collect-function-examples"></a>

下列 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)
```