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_clause
和DISTINCT
一起。ST_Collect()
对参数进行处理如下:-
NULL
参数将被忽略。 -
如果所有参数都是
NULL
或聚合结果为空,返回值为NULL
。 -
如果任何几何参数不是语法正确的几何,出现
ER_GIS_INVALID_DATA
错误。 -
如果任何几何参数是未定义的空间参考系统(SRS)中的语法正确几何,出现
ER_SRS_NOT_FOUND
错误。 -
如果有多个几何参数,并且这些参数在同一个空间参考系统(SRS)中,那么返回值就在该SRS中。如果这些参数不在同一个SRS中,将出现一个
ER_GIS_DIFFERENT_SRIDS_AGGREGATION
错误。 -
结果是可能的最小
Multi
或Xxx
GeometryCollection
值,结果类型由非空几何参数确定如下:-
如果所有参数都是
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)) | +-------------------------------+
-