Иллюстрированный самоучитель по PostgreSQL

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

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

В табл. 5.16 перечислены агрегатные функции, поддерживаемые в PostgreSQL. Полный список агрегатных функций выводится в psql командой \da.

Таблица 5.16. Агрегатные функции.

Функция Описание
avg (выражение) Возвращает среднее арифметическое значений выражения для всех записей в группе
count (выражение) Возвращает количество записей в группе, для которых значение выражения отлично от NULL
max (выражение) Возвращает максимальное значение выражения в группе
min (выражение) Возвращает минимальное значение выражения в группе
stddev (выражение) Возвращает среднеквадратичное отклонение значений выражения в группе
sum (выражение) Возвращает сумму значений выражения в группе
variance (выражение) Возвращает дисперсию значений выражения в группе

Ниже приведены более подробные описания всех агрегатных функций с конкретной информацией об особенностях использования, примерами и допустимыми типами входных данных. В дальнейших описаниях термин выражение означает любой идентификатор в итоговом наборе или любое действительное выражение, выполняющее операцию с этим идентификатором.

Агрегатные выражения

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

Если задано ключевое слово DISTINCT, функция обрабатывает только группы с уникальными значениями агрегатного выражения; группы с повторяющимися значениями игнорируются. Ключевое слово ALL, как и в команде SELECT, всего лишь явно указывает на тот факт, что выражение относится ко всем группам. В листинге 5.19 приведены примеры разных форм агрегатных выражений.

Листинг 5.19. Использование агрегатных выражений.

booktown=# SELECT count(location) AS setjocations,
booktown-# count(ALL location) AS all_set_locations,
booktown-# count(DISTINCT location) AS unique_locations,
booktown-# count(*) AS all_rows booktown-# FROM subjects;
setjocations | all_set_locations | uniquejocations all_rows
15 15 | 7 16
(1 row)

У агрегатных выражений также имеется специальная форма, продемонстрированная в столбце all_rows выходных данных листинга 5.19. Если при вызове агрегатной функции передается звездочка (*), это означает, что функция должна обрабатывать все поля, в том числе и обычно игнорируемые поля со значениями NULL. Поскольку таблица subjects содержит одну запись с полем location, равным NULL, результат подсчета записей по полю location отличается от результата подсчета по тому же нолю с использованием символа *.

Внимание
Записи, у которых в агрегатное выражение входит NULL, не обрабатываются агрегатными функциями (исключением является функция count()
.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.