Агрегатные функции

Агрегатные функции выполняют вычисление на наборе значений и возвращают одиночное значение. Агрегатные функции, за исключением COUNT, не учитывают значения NULL и часто используются совместно с предложением GROUP BY. Агрегатные функции могут быть использованы в качестве выражений только в следующих случаях:

  • Список выбора инструкции SELECT (вложенный или внешний запрос);

  • Предложение HAVING.

Любая агрегатная функция может быть использована в качестве оконной.

Общий синтаксис для использования

AGG_FUNC([ALL | DISTINCT] <expr>)
    [OVER ([<partition_exp>] [<order_exp>])]

где,

expr - выражение. Может содержать столбец таблицы, константу, переменную, выражение, неагрегатную функцию или UDF, которая возвращает числовой тип данных. Агрегатные функции в качестве выражения не допускаются.

Параметр ALL применяет агрегатную функцию ко всем значениям. ALL является параметром по умолчанию. Параметр DISTINCT указывает на то, что функция AVG будет выполнена только для одного экземпляра каждого уникального значения, независимо от того, сколько раз встречается это значение.

AVG

Функция AVG возвращает среднее значение для группы. Значения NULL пропускаются. В случае если выборка записей пустая или содержит только значения NULL, результат будет содержать NULL.

Функция AVG возвращает тот же типа данных, что и аргумент функции.

MIN и MAX

Функция MIN (MAX) возвращает минимальный (максимальный) среди элементов выборки, которые не равны NULL. При пустой выборке или при выборке из одних NULL функция возвратит NULL. Если аргумент функции строка, то функция вернёт значение, которое окажется первым (последним) в сортировке при применении COLLATE.

Параметр DISTINCT не имеет смысла при использовании функций MIN и MAX и доступен только для совместимости со стандартом.

Функция MAX возвращает DOUBLE PRECISION или масштабируемый BIGINT в зависимости от типа аргумента функции. Функция MIN возвращает тот же типа данных, что и аргумент функции.

SUM

Функция SUM возвращает сумму элементов выборки, которые не равны NULL. При пустой выборке, или при выборке из одних NULL функция возвратит NULL. ALL является опцией по умолчанию. При ней обрабатываются все значения из выборки, не содержащие NULL. При указании DISTINCT из выборки устраняются дубликаты, после осуществляется подсчёт.

Функция SUM возвращает тот же типа данных, что и аргумент функции.

LIST

Функция имеет параметр, который можно указать через запятую

LIST([ALL | DISTINCT] <expr> [, separator])

, где

separator - разделитель. Выражение строкового типа. По умолчанию разделителем является запятая.

Функция LIST возвращает строку, содержащую значения элементов выборки, которые не равны NULL. При пустой выборке функция возвратит NULL. Тип возвращаемого значения текстовый BLOB за исключением тех случаев, когда выражением являются BLOB других подтипов. ALL является опцией по умолчанию. При ней обрабатываются все значения в выборке, не содержащие NULL. При указании DISTINCT из выборки устраняются дубликаты. Значения выражения expr и разделитель separator поддерживают тип данных BLOB любого размера и набора символов. Поля типа дата / время и числовые перед проведением операции конкатенации преобразуются в строки.

Порядок конкатенации строк определяется порядком чтения записей из источников, который в общем случае не определён. Для придания списку необходимого порядка вы можете предварительно упорядочить источник данных, например с помощью производной таблицы.

COUNT

Функция COUNT возвращает количество значений в группе, которые не являются NULL. При указании DISTINCT из выборки устраняются дубликаты, ALL является значением по умолчанию для всех выборки значений не NULL.

Существует специальная форма оператора COUNT(*). При этом будут подсчитаны все строки. Функция COUNT(*) не принимает параметры и не может использоваться с ключевым словом DISTINCT. Для функции COUNT(*) не нужен параметр expr, так как по определению она не использует сведения о каких-либо конкретных столбцах. Функция COUNT(*) возвращает количество строк в указанной таблице, не отбрасывая дублированные строки. Она подсчитывает каждую строку отдельно. При этом учитываются и строки, содержащие значения NULL.

Функция возвращает тип данных BIGINT. Для пустой выборки данных или если при выборке окажутся одни значения, содержащие NULL, функция COUNT возвратит значение равное 0.

Пример использования аггрегатных функций

SELECT dept_no,
    COUNT(*) AS cnt,
    COUNT(DISTINCT job_country) AS uniq_cnt,
    AVG(salary),
    MIN(salary),
    MAX(salary),
    LIST(JOB_COUNTRY, '; ')
FROM employee
GROUP BY dept_no
FETCH FIRST 5 ROWS ONLY

Выполнение этого запроса на БД employee вернет

DEPT_NO

CNT

UNIQ_CNT

AVG

MIN

MAX

LIST

000

2

1

133321.50

53793.00

212850.00

USA; USA

100

2

1

77631.25

44000.00

111262.50

USA; USA

110

2

1

65221.40

61637.81

68805.00

USA; USA

115

2

1

6740000.00

6000000.00

7480000.00

Japan; Japan

120

3

1

31926.56

22935.00

39224.06

England; England; England

Обратите внимание, что количество уникальных стран, в которых работают сотрудники меньше, чем общее количество. Столбец LIST содержит список стран с указанными нами разделителем „;“. Имена полей, в которых использована аггрегатная функция, но которым не назначены явно имена, используют по умолчанию имя функции.