Посмотрим сегодня на реализацию агрегатных функций в SoQoL.
В СУБД SoQoL сейчас реализованы наиболее востребованные агрегатные функции, которые мы решили кратко рассмотреть в одной публикации.
Итак, начнём
AVG – функция используется для вычисления среднего значения набора чисел.
Её синтаксис в SoQoL вполне привычен для пользователей Oracle, PostgreSQL, MS SQL Server и выглядит так:
AVG (<выражение>)
Значениями аргумента могут быть значения любого числового типа данных, поддерживаемого SOQOL и значения типов CHAR, VARCHAR. Последние два функция попытается неявно преобразовать в значение типа NUMBER максимальной точности.
COUNT – функция выполняет подсчёт числа строк, возвращаемых запросом, или количества не NULL-значений заданного выражения для этих строк.
Синтаксис в SoQoL также привычен для пользователей Oracle, PostgreSQL, MS SQL Server:
COUNT ( <выражение> )
Если указать COUNT(*), то функция вернёт общее число строк таблицы, с учётом строк-дубликатов.
Здесь для аргумента нет ограничений в типе данных – допустимы значения любого типа, поддерживаемого в СУБД.
MAX и MIN – эти функции используются для поиска максимального и минимального значения среди значений аргумента соответственно.
MAX (<выражение>)
MIN ( <выражение>)
STRING_AGG – функция используется для конкатенации не NULL-значений аргумента с заданным разделителем между ними.
STRING_AGG (<выражение>, <разделитель>)
Если в качестве разделителя будет NULL, то значения аргумента будут конкатенированы без разделителя.
Если посмотреть другие СУБД, то что у них:
В Oracle21с функция, используемая для объединения значений столбца в одну строку, называется LISTAGG.
А вот в MS SQL Server2022 и PostgreSQL15 можно использовать для объединения значений в одну строку с использованием разделителя функцию STRING_AGG.
Что здесь с типами?
В SoQoL значения аргументов могут быть (пока) только типов CHAR, VARCHAR, BINARY, VARBINARY. При этом значения аргументов должны иметь одинаковый тип данных: или строковый, или бинарный, иначе функция закончит работу с ошибкой.
в SQL Server 2022 функция STRING_AGG не поддерживает типы данных CLOB и BLOB.
SUM - функция выполняет суммирование числовых значений аргумента:
SUM (<выражение>)
Такой синтаксис также знаком и привычен пользователям многих СУБД.
По типам данных аргумента функции SUM ситуация такая же, как в AVG.
Перед аргументом каждой упомянутой выше функции можно указать ALL или DISTINCT:
– ALL позволяет функции производить операции со всеми значениями аргумента (с учётом дубликатов). ALL используется по умолчанию;
– с указанием DISTINCT функция будет использовать значения аргументов без дубликатов.
При этом стоит упомянуть, что агрегатные функции не берут в работу NULL-значения.
Тут можно было бы добавить, что некоторые функции в известных СУБД имеют более расширенный синтаксис и могут использоваться и в качестве оконных функций (например, AVG, SUM и т.д.), но это уже другая история, к которой SoQoL постепенно движется.
Подскажите, как часто вы используете оконные функции и в каких задачах?