Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Spatial Aggregate Functions

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值,结果类型由非空几何参数确定如下:

      • 如果所有参数都是Point值,那么结果是一个MultiPoint值。

      • 如果所有参数都是LineString值,那么结果是一个MultiLineString值。

      • 如果所有参数都是Polygon值,那么结果是一个MultiPolygon值。

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

    以下是hypothetical产品的数据集,按年份和制造地点分类:

    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()的示例查询,基于数据集:

    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)) |
    +-------------------------------+