暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的函数和运算符 - 空间分析函数 - 空间聚合函数

数据库杂货铺 2021-08-27
1136
空间聚合函数
 
MySQL 支持对一组值执行计算的聚合函数。
 
ST_Collect() 可以作为一个窗口函数使用,如语法描述中的 [over_clause] 所示,表示一个可选的 OVER 子句。
 
● ST_Collect([DISTINCT] g) [over_clause]
 
聚合几何值并返回单个几何集合值。使用 DISTINCT 选项,返回不同几何参数的聚合。
 
与其他聚合函数一样,可以使用 GROUP BY 将参数分组为子集。ST_Collect() 返回每个子集的聚合值。
 
如果存在 over_clause 子句,此函数将作为窗口函数执行。与大多数支持窗口的聚合函数相比,ST_Collect() 允许将 over_clause 子句与 DISTINCT 一起使用。
 
ST_Collect() 按照如下所示处理它的参数:
 
NULL 参数被忽略。
 
■ 如果所有参数为 NULL 或聚合结果为空,则返回值为 NULL
 
■ 如果任何几何参数不是语法良好的几何值,就会发生 ER_GIS_INVALID_DATA 错误。
 
■ 如果几何参数是语法良好的几何值,但处于未定义的空间参照系统(SRS),就会发生 ER_SRS_NOT_FOUND 错误。
 
■ 如果有多个几何参数,并且这些参数在同一个SRS中,则返回值在该SRS中。如果这些参数不在同一个SRS中,则会发生 ER_GIS_DIFFERENT_SRIDS_AGGREGATION 错误。
 
结果是最窄的 MultiXxx  GeometryCollection 值,结果类型由非 NULL 几何参数确定,如下所示:
 
○ 如果所有参数都是 Point 值,则结果是 MultiPoint 值。
 
○ 如果所有参数都是 LineString 值,则结果是一个 MultiLineString 值。
 
○ 如果所有参数都是 Polygon 值,则结果是 MultiPolygon 值。
 
○ 其他情况下,参数是各种几何类型的混合,结果是一个 GeometryCollection 值。
 
以下示例数据集按年份和生产地点显示了假设的产品:
 
    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)) |
      +-------------------------------+
      复制
       

      此函数是在MySQL 8.0.24中添加的。

       
       
      官方网址
      https://dev.mysql.com/doc/refman/8.0/en/spatial-aggregate-functions.html
      文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论