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