9.21. Агрегатные функции#
9.21. Агрегатные функции #
Агрегатные функции вычисляют единственный результат из набора входных значений. Встроенные универсальные агрегатные функции перечислены в Таблица 9.59 в то время как статистические агрегаты находятся в Таблица 9.60. Встроенные агрегатные функции с отсортированным набором внутри группы перечислены в Таблица 9.61 в то время как встроенные функции с гипотетизирующим набором внутри группы находятся в Таблица 9.62. Операции группирования, которые тесно связаны с агрегатными функциями, перечислены в Таблица 9.63. Особые синтаксические соображения для агрегатных функций объясняются в Раздел 4.2.7. Дополнительную вводную информацию см. в Раздел 2.7.
Агрегатные функции, которые поддерживают Partial Mode, имеют право на участие в различных оптимизациях, таких как параллельная агрегация.
Таблица 9.59. Общие агрегатные функции
Функция Описание | Partial Mode |
|---|---|
Возвращает произвольное значение из непустых входных значений. | Yes |
Собирает все входные значения, включая пустые значения, в массив. | Yes |
Объединяет все входные массивы в массив одного более высокого измерения. (Входные данные должны иметь одинаковую размерность и не могут быть пустыми или нулевыми). | Yes |
|
Вычисляет среднее значение (арифметическое среднее) всех ненулевых входных значений. | Yes |
Вычисляет побитовое И всех ненулевых входных значений. | Yes |
Вычисляет побитовое ИЛИ всех ненулевых входных значений. | Yes |
Вычисляет побитовое исключающее ИЛИ всех ненулевых входных значений. Может быть полезным в качестве контрольной суммы для неупорядоченного набора значений. | Yes |
Возвращает true, если все ненулевые входные значения истинны, в противном случае возвращает false. | Yes |
|
Возвращает true, если любое ненулевое входное значение является true, в противном случае возвращает false. | Yes |
|
Вычисляет количество входных строк. | Yes |
Вычисляет количество входных строк, в которых входное значение не является нулевым. | Yes |
|
Это эквивалент стандарта SQL к | Yes |
Собирает все входные значения, включая пустые значения, в JSON-массив.
Значения преобразуются в JSON с помощью функций | No |
Собирает все входные значения, пропуская null, в массив JSON.
Значения преобразуются в JSON в соответствии с | No |
Ведет себя так же, как
| No |
Ведет себя как
| No |
Собирает все пары ключ/значение в объект JSON. Аргументы ключа
приводятся к тексту; аргументы значения конвертируются в соответствии с
| No |
Собирает все пары ключ/значение в объект JSON. Аргументы ключа
приводятся к тексту; аргументы значения конвертируются в соответствии с
| No |
Собирает все пары ключ/значение в объект JSON. Аргументы ключей
приводятся к тексту; аргументы значений конвертируются в соответствии с
| No |
Собирает все пары ключ/значение в объект JSON. Аргументы ключа
приводятся к тексту; аргументы значения конвертируются в соответствии с
| No |
Вычисляет максимум из ненулевых входных значений. Доступно для любого числового, строкового, дата/время или перечислимого типа, а также для типов | Yes |
Вычисляет минимальное значение из ненулевых входных значений. Доступно для любого числового, строкового, даты/времени или перечислимого типа, а также для типов | Yes |
Вычисляет объединение ненулевых входных значений. | No |
Вычисляет пересечение ненулевых входных значений. | No |
Конкатенирует ненулевые значения ввода в строку. Каждое значение после первого предшествует соответствующему | Yes |
|
Вычисляет сумму ненулевых входных значений. | Yes |
|
Соединяет ненулевые значения входных XML (см. Раздел 9.15.1.7). | No |
Важно отметить, что за исключением функции 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 внутри вызова агрегатной функции, как показано в
Раздел 4.2.7.
В качестве альтернативы, предоставление входных значений из отсортированного подзапроса
обычно работает. Например:
SELECT xmlagg(x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab;
Будьте осторожны, такой подход может не сработать, если внешний уровень запроса содержит дополнительную обработку, такую как соединение, потому что это может привести к переупорядочиванию вывода подзапроса перед вычислением агрегата.
Примечание
Логические агрегаты bool_and и
bool_or соответствуют стандартным SQL-агрегатам
every и any или
some.
Tantor SE-1C
поддерживает every, но не any
или some, потому что в стандартном синтаксисе есть неоднозначность:
SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;
Здесь ANY может рассматриваться как введение подзапроса, так и как агрегатная функция, если подзапрос возвращает одну строку с логическим значением.
Таким образом, стандартное имя не может быть присвоено этим агрегатам.
Примечание
Пользователи, привыкшие работать с другими системами управления базами данных SQL, могут быть разочарованы производительностью агрегата count, когда он применяется ко всей таблице. Запрос вроде:
SELECT count(*) FROM sometable;
потребуется усилие, пропорциональное размеру таблицы: Tantor SE-1C будет необходимо просканировать либо всю таблицу, либо полностью индекс, который включает все строки в таблице.
Таблица 9.60 показывает агрегатные функции, обычно используемые в статистическом анализе.
(Они выделены отдельно, чтобы не загромождать список более часто используемых агрегатов). Функции, отмеченные как принимающие numeric_type, доступны для всех типов smallint, integer, bigint, numeric, real и double precision.
Если в описании упоминается N, это означает количество входных строк, для которых все входные выражения не являются нулевыми.
Во всех случаях возвращается значение null, если вычисление бессмысленно, например, когда N равно нулю.
Таблица 9.60. Агрегатные функции для статистики
Таблица 9.61 показывает некоторые
агрегатные функции, которые используют синтаксис агрегатной функции с отсортированным набором.
Эти функции иногда называются “обратными функциями распределения”.
Их вместе вводят с помощью ORDER BY, и они также могут принимать прямой аргумент, который не агрегируется, а вычисляется только один раз.
Все эти функции игнорируют пустые значения при агрегированном вводе.
Для тех, которые принимают параметр fraction, значение fraction должно быть между 0 и 1; если это не так, будет сгенерирована ошибка.
Однако, пустое значение fraction просто приводит к получению пустого результата.
Таблица 9.61. Агрегатные функции с отсортированным набором
Каждая из агрегатных функций “hypothetical-set”, перечисленных в
Таблица 9.62, связана с
оконной функцией с тем же именем, определенным в
Раздел 9.22. В каждом случае результат агрегатной функции
является значением, которое связанная оконная функция вернула бы для
“hypothetical” строки, созданной из
args, если бы такая строка была добавлена в отсортированную
группу строк, представленную sorted_args.
Для каждой из этих функций список прямых аргументов,
указанных в args, должен соответствовать количеству и типам
агрегированных аргументов, указанных в sorted_args.
В отличие от большинства встроенных агрегатных функций, эти агрегатные функции не являются строгими, то есть
они не отбрасывают входные строки, содержащие значения null. Значения null сортируются в соответствии
с правилом, указанным в предложении ORDER BY.
Таблица 9.62. Гипотетизирующие агрегатные функции
Таблица 9.63. Операции группировки
Операции группирования, показанные в Таблица 9.63, используются в сочетании с наборами группирования (см. Раздел 7.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 rows)=>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 rows)
Здесь значение grouping равное 0 в первых четырех строках показывает, что они были сгруппированы нормально по обоим столбцам группирования. Значение 1 указывает, что в предпоследних двух строках model не был сгруппирован, а значение 3 указывает, что ни make, ни model не были сгруппированы в последней строке (которая, следовательно, является агрегатом по всем входным строкам).