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, возникает ошибка.
-
Результат является самым узким
MultiилиXxxGeometryCollectionзначением, возможным, а тип результата определяется по не-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 resultFROM product;+------------------------------------------------------------------+ | result | +------------------------------------------------------------------+ | MULTIPOINT((60 -24),(28 -77),(28 -77),(38 60),(60 -24),(28 -77)) | +------------------------------------------------------------------+ mysql>SELECT ST_AsText(ST_Collect(DISTINCT location)) AS resultFROM product;+---------------------------------------+ | result | +---------------------------------------+ | MULTIPOINT((60 -24),(28 -77),(38 60)) | +---------------------------------------+ mysql>SELECT year, ST_AsText(ST_Collect(location)) AS resultFROM 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 resultFROM 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 resultFROM 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 resultFROM 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.