MySQL は、一連の値に対して計算を実行する集計関数をサポートしています。 これらの関数の一般的な情報は、セクション12.20.1「集計関数の説明」 を参照してください。 このセクションでは、ST_Collect()
の空間集計関数について説明します。
ST_Collect()
は、オプションの OVER
句を表す、[
による構文の説明で示されているように、ウィンドウ関数として使用できます。over_clause
]over_clause
については、セクション12.21.2「Window 関数の概念と構文」 で説明されています。セクション12.21.2「Window 関数の概念と構文」 には、ウィンドウ関数の使用方法に関するその他の情報も含まれています。
-
ST_Collect([DISTINCT]
g
) [over_clause
]ジオメトリ値を集計し、単一のジオメトリコレクション値を戻します。
DISTINCT
オプションを指定すると、個別のジオメトリ引数の集計が戻されます。他の集計関数と同様に、
GROUP BY
を使用して引数をサブセットにグループ化できます。ST_Collect()
は、各サブセットの集計値を返します。over_clause
が存在する場合、この関数はウィンドウ関数として実行されます。over_clause
については、セクション12.21.2「Window 関数の概念と構文」 を参照してください。 ウィンドウ集計をサポートするほとんどの集計関数とは対照的に、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
エラーが発生します。-
結果は、次のように
NULL
以外のジオメトリ引数から決定された結果タイプを使用して、可能なかぎり狭いMulti
またはXxx
GeometryCollection
値になります:すべての引数が
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 で追加されました。