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