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或XxxGeometryCollection值,結果類型根據非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)) | +-------------------------------+