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