Агрегатные функции Агрегатные функции вычисляют единичный результат на основе набора входных значений. Встроенные агрегатные функции общего назначения перечислены в Таблица 2.6.60 в то время как статистические агрегатные функции приведены в Таблица 2.6.61. Встроенные агрегатные функции для упорядоченных наборов (ordered-set aggregate functions), работающие внутри групп, перечислены в Таблица 2.6.62 а встроенные агрегатные функции гипотетического набора (within-group hypothetical-set) — в Таблица 2.6.63. Операции группировки, которые тесно связаны с агрегатными функциями, перечислены в Таблица 2.6.64. Специальные синтаксические аспекты применения агрегатных функций описаны в Раздел 2.1.2.7. Обратитесь к Раздел 1.2.7 для получения дополнительной вводной информации.
Агрегатные функции, поддерживающие Partial Mode могут использоваться в различных оптимизациях, таких как параллельная агрегация.
Хотя все указанные ниже агрегатные функции поддерживают необязательное
ORDER BY предложение (как описано в Раздел 2.1.2.7), оно было добавлено только для тех функций, на результат которых влияет порядок сортировки.
Таблица 2.6.60. Агрегатные функции общего назначения
Функция Описание | Partial Mode |
|---|---|
Возвращает произвольное значение из набора входных данных, не содержащих NULL. | Да |
Собирает все входные значения, включая NULL, в массив. | Да |
Выполняет объединение всех входных массивов в массив, размерность которого на единицу больше. (Все входные массивы должны иметь одинаковую размерность и не могут быть пустыми или иметь значение NULL.) | Да |
|
Вычисляет среднее значение (арифметическое среднее) всех входных значений, отличных от NULL. | Да |
Вычисляет поразрядное И (AND) всех входных значений, отличных от NULL. | Да |
Вычисляет поразрядное ИЛИ (OR) всех входных значений, отличных от NULL. | Да |
Вычисляет поразрядное исключающее ИЛИ (XOR) всех входных значений, отличных от NULL. Может использоваться в качестве контрольной суммы для неупорядоченного набора значений. | Да |
Возвращает true, если все отличные от NULL входные значения истинны, иначе возвращает false. | Да |
|
Возвращает true, если хотя бы одно отличное от NULL входное значение истинно, иначе возвращает false. | Да |
|
Вычисляет общее количество входных строк. | Да |
Вычисляет количество входных строк, в которых входное значение не является NULL. | Да |
|
Данное выражение является эквивалентом стандарта SQL для | Да |
Агрегирует все входные значения, включая значения NULL, в массив JSON.
Значения преобразуются в формат JSON в соответствии с правилами | Нет |
Агрегирует все входные значения, пропуская значения NULL, в массив JSON.
Значения преобразуются в формат JSON в соответствии с правилами | Нет |
Функция работает так же, как и функция
| Нет |
Работает аналогично функции
| Нет |
Собирает все пары «ключ-значение» в объект JSON. Аргументы-ключи
приводятся к текстовому типу text; аргументы-значения преобразуются в соответствии с
| Нет |
Собирает все пары «ключ-значение» в объект JSON. Аргументы-ключи
приводятся к текстовому типу text; аргументы-значения преобразуются в соответствии с
| Нет |
Собирает все пары «ключ-значение» в объект JSON. Аргументы-ключи
приводятся к текстовому типу text; аргументы-значения преобразуются в соответствии с
| Нет |
Собирает все пары «ключ-значение» в объект JSON. Аргументы-ключи
приводятся к текстовому типу text; аргументы-значения преобразуются в соответствии с
| Нет |
Вычисляет максимальное значение среди входных
значений, не равных NULL. Функция доступна для любых числовых, строковых типов, типов даты/времени или перечислимых типов,
а также для типов | Да |
Вычисляет минимальное значение среди входных данных, отличных от null
значений, не равных NULL. Функция доступна для любых числовых, строковых типов, типов даты/времени или перечислимых типов,
а также для типов | Да |
Вычисляет объединение входных значений, отличных от null. | Нет |
Вычисляет пересечение входных значений, отличных от null. | Нет |
Объединяет входные значения, отличные от null, в строку. Каждое значение
после первого предваряется соответствующим
разделителем | Да |
|
Вычисляет сумму входных значений, отличных от null. | Да |
Выполняет конкатенацию входных XML-значений, отличных от null (см. Раздел 2.6.15.1.8). | Нет |
Следует отметить, что за исключением count,
данные функции возвращают значение null, если не выбрана ни одна строка. В
частности, sum при отсутствии строк возвращает null, а не
ноль, как можно было бы ожидать, и array_agg
возвращает null вместо пустого массива при отсутствии входных строк. Функция coalesce может применяться для замены значения null нулем или пустым массивом при необходимости.
Агрегатные функции array_agg,
json_agg, jsonb_agg,
json_agg_strict, jsonb_agg_strict,
json_object_agg, jsonb_object_agg,
json_object_agg_strict, jsonb_object_agg_strict,
json_object_agg_unique, jsonb_object_agg_unique,
json_object_agg_unique_strict,
jsonb_object_agg_unique_strict,
string_agg,
и xmlagg, а также аналогичные пользовательские агрегатные функции, формируют существенно различающиеся результирующие значения в зависимости от порядка следования входных данных. По умолчанию данный порядок не определен, однако им можно управлять с помощью
ORDER BY предложения внутри вызова агрегатной функции, как показано в
Раздел 2.1.2.7. Кроме того, обычно допустимым решением является передача входных значений из отсортированного подзапроса. Например:
SELECT xmlagg(x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab;
Необходимо учитывать, что данный подход может оказаться неэффективным, если внешний уровень запроса содержит дополнительную обработку, например соединение (join), так как это может привести к переупорядочиванию выходных строк подзапроса перед выполнением агрегации.
Логические агрегатные функции bool_and и
bool_or соответствуют стандартным агрегатным функциям языка SQL
каждый и any or
some.
Digital Q.DataBase
поддерживает каждый, но не any
OR some, так как в стандартном синтаксисе присутствует неоднозначность:
SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;
Здесь ANY может рассматриваться либо как введение подзапроса, либо как агрегатная функция, если данный подзапрос возвращает одну строку с логическим значением. Следовательно, этим агрегатным функциям невозможно присвоить стандартное имя.
Пользователи, имеющие опыт работы с другими системами управления базами данных на языке SQL, могут быть не удовлетворены производительностью
count агрегатной функции при ее применении ко всей таблице. Запрос вида:
SELECT count(*) FROM sometable;
потребует ресурсов, пропорциональных размеру таблицы: Digital Q.DataBase потребуется выполнить сканирование либо всей таблицы, либо всего индекса, содержащего все строки таблицы.
Таблица 2.6.61 В данной таблице представлены агрегатные функции, обычно используемые при проведении статистического анализа. (Они вынесены в отдельный раздел исключительно для того, чтобы не загромождать список более употребительных агрегатных функций.) Функции, для которых указано, что они принимают numeric_type доступны для всех
типов данных smallint, integer,
bigint, numeric, real,
и double precision.
В тех случаях, когда в описании упоминается
N, это означает количество входных строк, в которых значения всех входных выражений отличны от NULL. Во всех случаях возвращается значение NULL, если выполнение вычисления не имеет смысла, например, когда N равно нулю.
Таблица 2.6.61. Агрегатные функции для статистики
Таблица 2.6.62 приведены некоторые
агрегатные функции, использующие агрегатных функций внутригрупповой сортировки
синтаксис. Данные функции иногда называют функциями «обратного
распределения» часовой пояс. Их агрегируемые входные данные вводятся предложением
ORDER BY, также они могут принимать прямой
аргумент который не агрегируется, а вычисляется только один раз.
Все эти функции игнорируют значения null во входных агрегируемых данных.
Для функций, принимающих доля параметр, значение аргумента fraction должно находиться в диапазоне от 0 до 1; в противном случае возвращается ошибка.
При этом значение null доля просто возвращает
результат null.
Таблица 2.6.62. Агрегатные функции упорядоченного набора
Каждая из «агрегатных функций для гипотетических наборов,» перечисленных в
Таблица 2.6.63 , связана с одноименной оконной функцией, определенной в
Раздел 2.6.22. В каждом случае результатом агрегата является значение, которое было бы возвращено соответствующей оконной функцией для «гипотетической» строки, сформированной на основе аргументов
args, если бы такая строка была добавлена в отсортированную
группу строк, представленную в sorted_args. Для каждой из этих функций список прямых аргументов, указанных в args должны соответствовать количеству и типам
агрегируемых аргументов, указанных в sorted_args.
В отличие от большинства встроенных агрегатных функций, данные агрегаты не являются строгими (strict), то есть
они не игнорируют входные строки, содержащие значения NULL. Значения NULL сортируются согласно правилу, указанному в ORDER BY предложении.
Таблица 2.6.63. Агрегатные функции наборов гипотетических значений
Таблица 2.6.64. Операции группировки
Операции группировки, представленные в
Таблица 2.6.64 используются в сочетании с
наборами группирования grouping sets (см. Раздел 2.4.2.4) для идентификации
результирующих строк. Аргументы функции GROUPING выражения функций фактически не вычисляются, однако они должны в точности соответствовать выражениям, указанным в GROUP BY предложении соответствующего уровня запроса.
Например:
=>SELECT * FROM items_sold;make | model | sales -------+-------+------- Foo | GT | 10 Foo | Tour | 20 Bar | City | 15 Bar | Sport | 5 (4 строки)=>SELECT make, model, GROUPING(make,model), sum(sales) FROM items_sold GROUP BY ROLLUP(make,model);make | model | grouping | sum -------+-------+----------+----- Foo | GT | 0 | 10 Foo | Tour | 0 | 20 Bar | City | 0 | 15 Bar | Sport | 0 | 5 Foo | | 1 | 30 Bar | | 1 | 20 | | 3 | 50 (7 строк)
В данном случае значение функции grouping 0 в первых четырех строках показывает, что данные были сгруппированы обычным образом по обоим столбцам группировки. Значение 1 указывает
на то, что модель не использовалось при группировке в предпоследних двух строках, а значение 3 указывает на то, что ни одно из марка ни модель не использовалось при группировке
в последней строке (которая, следовательно, представляет собой агрегат по всем входным
строкам).