Spec-Zone.ru › 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_clause вместе с DISTINCT.

    ST_Collect() обрабатывает свои аргументы следующим образом:

    • Аргументы NULL игнорируются.

    • Если все аргументы являются NULL или результат агрегирования пуст, возвращаемое значение равно NULL.

    • Если любой геометрический аргумент не является синтаксически корректной геометрией, возникает ошибка.

    • Если любой геометрический аргумент является синтаксически корректной геометрией в неопределённой системе пространственных ссылок (SRS), возникает ошибка.

    • Если есть несколько геометрических аргументов и эти аргументы находятся в одной и той же системе SRS, возвращаемое значение находится в этой SRS. Если эти аргументы не находятся в одной и той же SRS, возникает ошибка.

    • Результат является самым узким MultiXxx или 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)) |
    +-------------------------------+
    

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/spatial-aggregate-functions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API