文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man 页面 (TGZ) - 258.5Kb
Man 页面 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  空间聚合函数

14.16.12 空间聚合函数

MySQL 支持执行对一组值进行计算的聚合函数。有关这些函数的常规信息,请参见 第 14.19.1 节,“聚合函数描述”。本节介绍 ST_Collect() 空间聚合函数。

ST_Collect() 可用作窗口函数,如其语法描述中以 [over_clause] 表示,代表可选的 OVER 子句。 over_clause第 14.20.2 节,“窗口函数的概念和语法” 中进行了描述,该节还包括有关窗口函数用法的其他信息。

  • ST_Collect([DISTINCT] g) [over_clause]

    聚合几何值并返回单个几何集合值。使用 DISTINCT 选项,返回对不同的几何参数的聚合。

    与其他聚合函数一样,可以使用 GROUP BY 将参数分组到子集中。 ST_Collect() 为每个子集返回一个聚合值。

    如果存在 over_clause,则该函数作为窗口函数执行。 over_clause第 14.20.2 节,“窗口函数的概念和语法” 中所述。与大多数支持窗口化的聚合函数不同,ST_Collect() 允许将 over_clauseDISTINCT 结合使用。

    ST_Collect() 处理其参数的方式如下

    • NULL 参数将被忽略。

    • 如果所有参数都为 NULL 或聚合结果为空,则返回值为 NULL

    • 如果任何几何参数不是语法上格式良好的几何,则会发生 ER_GIS_INVALID_DATA 错误。

    • 如果任何几何参数是语法上格式良好的几何,但位于未定义的空间参考系统 (SRS) 中,则会发生 ER_SRS_NOT_FOUND 错误。

    • 如果有多个几何参数,并且这些参数位于同一个 SRS 中,则返回值位于该 SRS 中。如果这些参数不在同一个 SRS 中,则会发生 ER_GIS_DIFFERENT_SRIDS_AGGREGATION 错误。

    • 结果是最窄的 MultiXxxGeometryCollection 值,结果类型由非 NULL 几何参数确定,如下所示

      • 如果所有参数都是 Point 值,则结果为 MultiPoint 值。

      • 如果所有参数都是 LineString 值,则结果为 MultiLineString 值。

      • 如果所有参数都是 Polygon 值,则结果为 MultiPolygon 值。

      • 否则,参数是几何类型的混合,结果为 GeometryCollection 值。

    此示例数据集显示了按年份和制造地点划分的假设产品

    Press CTRL+C to copy
    CREATE TABLE product ( year INTEGER, product VARCHAR(256), location Geometry ); INSERT INTO product (year, product, location) VALUES (2000, "Calculator", ST_GeomFromText('point(60 -24)',4326)), (2000, "Computer" , ST_GeomFromText('point(28 -77)',4326)), (2000, "Abacus" , ST_GeomFromText('point(28 -77)',4326)), (2000, "TV" , ST_GeomFromText('point(38 60)',4326)), (2001, "Calculator", ST_GeomFromText('point(60 -24)',4326)), (2001, "Computer" , ST_GeomFromText('point(28 -77)',4326));

    一些使用 ST_Collect() 对数据集执行的示例查询

    Press CTRL+C to copy
    mysql> SELECT ST_AsText(ST_Collect(location)) AS result FROM product; +------------------------------------------------------------------+ | result | +------------------------------------------------------------------+ | MULTIPOINT((60 -24),(28 -77),(28 -77),(38 60),(60 -24),(28 -77)) | +------------------------------------------------------------------+ mysql> SELECT ST_AsText(ST_Collect(DISTINCT location)) AS result FROM product; +---------------------------------------+ | result | +---------------------------------------+ | MULTIPOINT((60 -24),(28 -77),(38 60)) | +---------------------------------------+ mysql> SELECT year, ST_AsText(ST_Collect(location)) AS result FROM product GROUP BY year; +------+------------------------------------------------+ | year | result | +------+------------------------------------------------+ | 2000 | MULTIPOINT((60 -24),(28 -77),(28 -77),(38 60)) | | 2001 | MULTIPOINT((60 -24),(28 -77)) | +------+------------------------------------------------+ mysql> SELECT year, ST_AsText(ST_Collect(DISTINCT location)) AS result FROM product GROUP BY year; +------+---------------------------------------+ | year | result | +------+---------------------------------------+ | 2000 | MULTIPOINT((60 -24),(28 -77),(38 60)) | | 2001 | MULTIPOINT((60 -24),(28 -77)) | +------+---------------------------------------+ # selects nothing mysql> SELECT ST_Collect(location) AS result FROM product WHERE year = 1999; +--------+ | result | +--------+ | NULL | +--------+ mysql> SELECT ST_AsText(ST_Collect(location) OVER (ORDER BY year, product ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)) AS result FROM product; +-------------------------------+ | result | +-------------------------------+ | MULTIPOINT((28 -77)) | | MULTIPOINT((28 -77),(60 -24)) | | MULTIPOINT((60 -24),(28 -77)) | | MULTIPOINT((28 -77),(38 60)) | | MULTIPOINT((38 60),(60 -24)) | | MULTIPOINT((60 -24),(28 -77)) | +-------------------------------+