文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  空間聚合函數

14.16.12 空間聚合函數

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_clauseDISTINCT 一起使用。

    ST_Collect() 按如下方式處理其引數

    • NULL 引數會被忽略。

    • 如果所有引數都是 NULL 或聚合結果為空,則傳回值為 NULL

    • 如果任何幾何引數不是語法上格式良好的幾何,則會發生 ER_GIS_INVALID_DATA 錯誤。

    • 如果任何幾何引數是未定義空間參考系統 (SRS) 中語法上格式良好的幾何,則會發生 ER_SRS_NOT_FOUND 錯誤。

    • 如果有多個幾何引數,並且這些引數在同一 SRS 中,則傳回值在該 SRS 中。如果這些引數不在同一 SRS 中,則會發生 ER_GIS_DIFFERENT_SRIDS_AGGREGATION 錯誤。

    • 結果是可能的最小 MultiXxxGeometryCollection 值,結果類型從非 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)) |
    +-------------------------------+