Найти тему

Агрегатных функций в SoQoL

Посмотрим сегодня на реализацию агрегатных функций в 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 постепенно движется.

Подскажите, как часто вы используете оконные функции и в каких задачах?