Агрегатные функции
Агрегатными функциями называется особый класс функций, применяемых сразу к нескольким записям набора данных, но возвращающим одно значение. Обычно агрегатные функции используются в запросах с группировкой по критерию, заданному в секции GROUP BY, но также встречается их применение в запросах, у которых целевой список состоит только из агрегатных функций. В этом случае агрегатная функция обрабатывает все записи итогового набора.
В табл. 5.16 перечислены агрегатные функции, поддерживаемые в PostgreSQL. Полный список агрегатных функций выводится в psql командой \da.
Таблица 5.16. Агрегатные функции
Функция | Описание |
avg( выражение’) | Возвращает среднее арифметическое значений выражения для всех записей в группе |
count ( выражение) | Возвращает количество записей в группе, для которых значение выражения отлично от NULL |
ma x ( выражение} | Возвращает максимальное значение выражения в группе |
mint выражение) | Возвращает минимальное значение выражения в группе |
stddev ( выражение) | Возвращает среднеквадратичное отклонение значений выражения в группе |
surrK выражение) | Возвращает сумму значений выражения в группе |
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)
У агрегатных выражений также имеется специальная форма, продемонстрированная в столбце al l_rows выходных данных листинга 5.19. Если при вызове агрегатной функции передается звездочка (*), это означает, что функция должна обрабатывать все поля, в том числе и обычно игнорируемые поля со значениями NULL. Поскольку таблица subjects содержит одну запись с полем location, равным NULL, результат подсчета записей по полю 1 ocati on отличается от результата подсчета по тому же нолю с использованием символа *.
ВНИМАНИЕ
Записи, у которых в агрегатное выражение входит NULL, не обрабатываются агрегатными функциями (исключением является функция count().
avg()
Синтаксис: avg(выражение)
Функция avg() получает агрегатное выражение, результат которого относится к любому из числовых типов (numeric, bigint, smallint, real или double precision) или к типу interval.
Функция возвращает среднее арифметическое всех данных, описываемых выражением. Возвращаемое значение относится к типу numeric для выражения типа integer или к типу double precision для выражения типа real. В остальных случаях тип возвращаемого значения совпадает с типом выражения.
Примеры
booktown=# SELECT avg(cost) AS average_cost,
booktown-# avg(retail) AS average_price,
booktown-# avg(retail — cost) AS average_profit
booktown-# FROM stock:
average_cost | average_price | average_prof1t
24.8235294118 | 30.0088235294 5.1852941176
(1 row)
x>oktown=# SELECT avg(cost)
AS average_cost, p.name AS publisher
booktown-# FROM stock JOIN editions USING (isbn))
booktown-l JOIN publishers AS p (publisheMd)
booktown-# USING (publisheMd)
booktown-# GROUP BY p.name;
average_cost | publisher
26.5000000000 | Ace Books
19.0000000000 | Books of Wonder
26.5000000000 I Doubleday
25.0000000000 | HarperCollins
18.0000000000 | Henry Holt & Company. Inc.
23.0000000000 I Kids Can Press
23.0000000000 | Mojo Press
20.0000000000 I Penguin
23.0000000000 Random House
26.5000000000 | Roc
26.0000000000 | Watson-Guptill Publications
(11 rows)
count()
Синтаксис:
count(выражение)
Функция countO возвращает количество значений, для которых выражение отлично от NULL. Тип выражения не ограничивается. Следует помнить, что функция count () подсчитывает только значения, отличные от NULL, поэтому для получения осмысленных результатов используемое выражение не должно возвращать NULL для подсчитываемых записей.
Если при вызове count() передается символ *, функция просто подсчитывает все записи, в том числе и содержащие NULL.
Примеры
booktown=# SELECT countC*) FROM editions;
count
17
(1 row)
booktown=# SELECT count(isbn). p.name
booktown-# FROM editions JOIN publishers AS p (publisheMd)
booktown-# USING (publisheMd)
booktown-# GROUP BY p.name
booktown-# ORDER BY count DESC;
count | name
3 | Random House
2 | Ace Books
2 | Doubleday
2 Roc
1 | Books of Wonder
1 | HarperCollins
1 | Henry Holt & Company. Inc.
1 | Kids Can Press
1 | Mojo Press
1 | O’Reilly & Associates
1 | Penguin
1 | Watson-Gupti11 Publications
(12 rows)
max()
Синтаксис:
max(выражение)
Функция max() возвращает максимальное значение заданного выражения в группе. Результатом выражения может быть значение любого числового или строкового типа, а также типа даты или времени. Тип возвращаемого значения совпадает с типом выражения.
Примеры
booktown=# SELECT max(cost), max(retail) FROM stock;
max max
36.00 I 46.95
(1 row)
booktown=# SELECT max(retail), p.name
booktown-# FROM (stock NATURAL JOIN editions)
booktown-# JOIN publishers AS p (publisher_id)
booktown-# USING (publisherjd)
booktown-# GROUP BY p.name
booktown-# ORDER BY max DESC;
max | name
46.95 | Roc
45.95 i Ace Books 36.95 Doubleday 32.95
Random House 28.95 HarperCollins
28.95 I Watson-Guptill Publications
24.95 | Mojo Press
24.95 | Penguin
23.95 1 Henry Holt & Company. Inc. 23.95
Kids Can Press 21.95 Books of Wonder
(11 rows)
min()
Синтаксис:
min (выражение)
Функция min() возвращает минимальное значение заданного выражения в группе. Результатом выражения может быть значение любого числового или строкового типа, а также типа даты или времени. Тип возвращаемого значения совпадает с типом выражения.
Примеры
booktown=# SELECT min(cost). min(retail) FROM stock;
min | min
16.00 16.95
(1 row)
booktown=# SELECT min(retail), p.name
booktown-# FROM (stock NATURAL JOIN editions)
booktown-# JOIN publishers AS p (publisheMd)
booktown-# USING (publisheMd)
booktown-l GROUP BY p.name
booktown-# ORDER BY min ASC;
miP 1 ..mme._
16.95 | Random House
21.95 Ace Books
21.95 I Books of Wonder
22.95 | Roc
23.95 | Henry Holt & Company. Inc.
23.95 | Kids Can Press
24.95 | Mojo Press
24.95 I Penguin
28.95 | Doubleday
28.95 I HarperCollins
28.95 | Watson-Guptill Publications
(11 rows)
stddev()
Синтаксис:
stddev(выражение)
Функция stddev О получает выражение, описывающее значения любого числового типа (numeri с, bigi nt, smal 1 i nt, real или doubl e preci si on), и возвращает среднеквадратичное отклонение для группы. Для вещественных выражений результат возвращается в виде значения типа double precision, а для остальных типов —в виде значения типа numeric.
Примеры
booktown=# SELECT stddev(retail) FROM stock;
stddev
8.46
(1 row)
booktown=# SELECT stddev(retail), p.name
booktown-# FROM (stock NATURAL JOIN editions)
booktown-# JOIN publishers AS p ON (publisheMd = p.id)
booktown-# GROUP BY p.name
booktown-# ORDER BY stddev DESC
booktown-# LIMIT 4:
stddev | name
16.97 | Ace Books
16.97 | Roc 8.02 Random House
5.66 | Doubleday
(4 rows)
sum()
Синтаксис:
sum (выражение)
Функция sum() получает выражение, описывающее значения любого числового типа (numeric, bigint, smallint, real или double precision), и возвращает сумму значений в группе. Для выражений типа integer результат возвращается в виде значения типа numeric, а для выражений типа real — в виде значения типа double precision. В остальных случаях тип возвращаемого значения совпадает с типом выражения.
Примеры
booktown=# SELECT sum(stock) FROM stock;
sum
«BOB»
(1 row)
booktown=# SELECT sum(stock). s.subject
booktown-# FROM ((stock NATURAL JOIN editions)
booktown(# JOIN books ON (books.id = bookjd))
booktown-f JOIN subjects AS s
booktown-# ON (books.subject_id = s.id)
booktown-# GROUP BY s.subject
booktown-# ORDER BY sum DESC;
189 | Horror
166 I Science Fiction
91 | Children’s Books
28 | Drama
18 | Classics
16 | Arts
(6 rows)
variance()
Синтаксис: variance(выражение)
Функция variance() получает выражение, описывающее значения любого числового типа (numeric, bigint, small int, real или double precision), и возвращает дисперсию для группы (stddevO в квадрате). Для вещественных выражений результат возвращается в виде значения типа double precision, а для остальных типов — в виде значения типа numeric.
Примеры
booktown=# SELECT variance(retaiT) FROM stock;
variance
71.60
(1 row)
booktown=# SELECT varianceCretail), p.name
booktown-# FROM (stock NATURAL JOIN editions)
booktown-# JOIN publishers AS p
booktown-# ON (editions.pub!isher_id = p.id)
booktown-# GROUP BY p.name
booktown-# ORDER BY variance DESC
booktown-# LIMIT 4: variance name
288.00 | Ace Books 288.00 I Roc 64.33 !
Random House 32.00 | Doubleday
(4 rows)