MySQL 8.0 リファレンスマニュアル


12.17.12 空間集計関数

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_clauseDISTINCT とともに使用できます。

    ST_Collect() は、その引数を次のように処理します:

    • NULL 引数は無視されます。

    • すべての引数が NULL の場合、または集計結果が空の場合、戻り値は NULL です。

    • ジオメトリ引数が構文的に整形式のジオメトリでない場合は、ER_GIS_INVALID_DATA エラーが発生します。

    • 未定義の空間参照システム (SRS) でジオメトリ引数が構文的に整形式のジオメトリである場合、ER_SRS_NOT_FOUND エラーが発生します。

    • 複数のジオメトリ引数があり、それらの引数が同じ SRS 内にある場合、戻り値はその SRS 内にあります。 これらの引数が同じ SRS 内にない場合は、ER_GIS_DIFFERENT_SRIDS_AGGREGATION エラーが発生します。

    • 結果は、次のように NULL 以外のジオメトリ引数から決定された結果タイプを使用して、可能なかぎり狭い MultiXxx または 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 で追加されました。


関連キーワード:  関数, 空間, 集計, Collect, ジオメトリ, result, MULTIPOINT, リファレンス, year, ウィンドウ