Агрегатные функции
Агрегатными функциями называется особый класс функций, применяемых сразу к нескольким записям набора данных, но возвращающим одно значение. Обычно агрегатные функции используются в запросах с группировкой по критерию, заданному в секции 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().