

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 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`。
+ 如果两个输入几何体都是线串，则返回具有两个线串的 `MULTILINESTRING`。
+ 如果两个输入几何体都是面，则返回具有两个面的 `MULTIPOLYGON`。
+ 否则，返回具有两个输入几何体的 `GEOMETRYCOLLECTION`。

ST\$1Collect 的第二个变体从几何体列中的几何体创建几何体。没有确定的几何体返回顺序。指定 WITHIN GROUP (ORDER BY ...) 子句以指定返回几何体的顺序。此变体的原理如下：
+ 如果输入聚合表达式中的所有非 NULL 行都是点，则返回包含聚合表达式中所有点的多点。
+ 如果聚合表达式中的所有非 NULL 行都是线串，则返回包含聚合表达式中所有线串的多线串。
+ 如果聚合表达式中的所有非 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 – 多线串中的线串。
+ 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)
```