Личный кабинет
Укажите e-mail, на который будет выслан код восстановления пароля.
На указанный вами адрес e-mail был выслан код подтверждения аккаунта. Введите полученный код для продолжения:
Введите новый пароль два раза:
Агрегатные функции получают единственный результат из набора входных значений. Встроенные агрегатные функции общего назначения перечислены в Таблице 9.55, а статистические агрегатные функции — в Таблице 9.56. Встроенные внутригрупповые сортирующие агрегатные функции перечислены в Таблице 9.57, встроенные внутригрупповые гипотезирующие — в Таблице 9.58. Группирующие операторы, тесно связанные с агрегатными функциями, перечислены в Таблице 9.59. Особенности синтаксиса агрегатных функцией разъясняются в Подразделе 4.2.7. За дополнительной вводной информацией обратитесь к Разделу 2.7.
Таблица 9.55. Агрегатные функции общего назначения
array_agg(выражение)
выражение
avg(выражение)
smallint
int
bigint
real
double precision
numeric
interval
bit_and(выражение)
bit
bit_or(выражение)
bool_and(выражение)
bool
bool_or(выражение)
count(*)
count(выражение)
выражения
every(выражение)
bool_and
json_agg(выражение)
any
json
jsonb_agg(выражение)
jsonb
json_object_agg(имя, значение)
имя
значение
(any, any)
jsonb_object_agg(имя, значение)
max(выражение)
min(выражение)
string_agg(выражение, разделитель)
разделитель
text
bytea
sum(выражение)
money
xmlagg(выражение)
xml
Следует заметить, что за исключением count, все эти функции возвращают NULL, если для них не была выбрана ни одна строка. В частности, функция sum, не получив строк, возвращает NULL, а не 0, как можно было бы ожидать, и array_agg в этом случае возвращает NULL, а не пустой массив. Если необходимо, подставить в результат 0 или пустой массив вместо NULL можно с помощью функции coalesce.
count
sum
array_agg
coalesce
Агрегатные функции, поддерживающие частичный режим, являются кандидатами на участие в различных оптимизациях, например, в параллельном агрегировании.
Булевы агрегатные функции bool_and и bool_or соответствуют стандартным SQL-агрегатам every и any или some. Что касается any и some, по стандарту их синтаксис допускает некоторую неоднозначность:
bool_or
every
some
SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;
Здесь ANY можно рассматривать и как объявление подзапроса, и как агрегатную функцию, если этот подзапрос возвращает одну строку с булевым значением. Таким образом, этим агрегатным функциям нельзя было дать стандартные имена.
ANY
Пользователи с опытом использования других СУБД SQL могут быть недовольны скоростью агрегатной функции count, когда она применяется ко всей таблице. Подобный запрос:
SELECT count(*) FROM sometable;
потребует затрат в количестве, пропорциональном размеру таблицы: Postgres Pro придётся полностью просканировать либо всю таблицу, либо один из индексов, включающий все её строки.
Агрегатные функции array_agg, json_agg, jsonb_agg, json_object_agg, jsonb_object_agg, string_agg и xmlagg так же, как и подобные пользовательские агрегатные функции, выдают разные по содержанию результаты в зависимости от порядка входных значений. По умолчанию порядок не определён, но его можно задать, дополнив вызов агрегатной функции предложением ORDER BY, как описано в Подразделе 4.2.7. Обычно нужного результата также можно добиться, передав для агрегирования результат подзапроса с сортировкой. Например:
json_agg
jsonb_agg
json_object_agg
jsonb_object_agg
string_agg
xmlagg
ORDER BY
SELECT xmlagg(x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab;
Но учтите, что этот подход может не работать, если на внешнем уровне запроса выполняется дополнительная обработка, например, соединение, так как при этом результат подзапроса может быть переупорядочен перед вычислением агрегатной функции.
В Таблице 9.56 перечислены агрегатные функции, обычно применяемые в статистическом анализе. (Они выделены просто для того, чтобы не загромождать список наиболее популярных агрегатных функций.) В их описании под N подразумевается число входных строк, для которых входные выражения не равны NULL. Все эти функции возвращают NULL во всех случаях, когда вычисление бессмысленно, например, когда N равно 0.
N
Таблица 9.56. Агрегатные функции для статистических вычислений
corr(Y, X)
Y
X
covar_pop(Y, X)
covar_samp(Y, X)
regr_avgx(Y, X)
sum(X)/N
regr_avgy(Y, X)
sum(Y)/N
regr_count(Y, X)
regr_intercept(Y, X)
regr_r2(Y, X)
regr_slope(Y, X)
regr_sxx(Y, X)
sum(X^2) - sum(X)^2/N
regr_sxy(Y, X)
sum(X*Y) - sum(X) * sum(Y)/N
regr_syy(Y, X)
sum(Y^2) - sum(Y)^2/N
stddev(выражение)
stddev_samp
stddev_pop(выражение)
stddev_samp(выражение)
variance
var_samp
var_pop
В Таблице 9.57 показаны некоторые агрегатные функции, использующие синтаксис сортирующих агрегатных функций. Иногда такие функции функциями называют функциями «обратного распределения».
Таблица 9.57. Сортирующие агрегатные функции
mode() WITHIN GROUP (ORDER BY выражение_сортировки)
выражение_сортировки
percentile_cont(дробь) WITHIN GROUP (ORDER BY выражение_сортировки)
дробь
percentile_cont(дроби) WITHIN GROUP (ORDER BY выражение_сортировки)
дроби
double precision[]
percentile_disc(дробь) WITHIN GROUP (ORDER BY выражение_сортировки)
percentile_disc(дроби) WITHIN GROUP (ORDER BY выражение_сортировки)
Все агрегатные функции, перечисленные в Таблице 9.57, игнорируют значения NULL при сортировке данных. Для функций, принимающих параметр дробь, значение этого параметра должно быть от 0 до 1; в противном случае возникает ошибка. Однако, если в этом параметре передаётся NULL, эти функции просто выдают NULL.
Все агрегатные функции, перечисленные в Таблице 9.58, связаны с одноимёнными оконными функциями, определёнными в Разделе 9.21. В каждом случае их результат — значение, которое вернула бы связанная оконная функция для «гипотетической» строки, полученной из аргументов, если бы такая строка была добавлена в сортированную группу строк, которую образуют сортированные_аргументы.
аргументов
сортированные_аргументы
Таблица 9.58. Гипотезирующие агрегатные функции
rank(аргументы) WITHIN GROUP (ORDER BY сортированные_аргументы)
аргументы
VARIADIC
"any"
dense_rank(аргументы) WITHIN GROUP (ORDER BY сортированные_аргументы)
percent_rank(аргументы) WITHIN GROUP (ORDER BY сортированные_аргументы)
cume_dist(аргументы) WITHIN GROUP (ORDER BY сортированные_аргументы)
Для всех этих гипотезирующих агрегатных функций непосредственные аргументы должны соответствовать (по количеству и типу) сортированным_аргументам. В отличие от встроенных агрегатных функций, они не являются строгими, то есть не отбрасывают входные строки, содержащие NULL. Значения NULL сортируются согласно правилу, указанному в предложении ORDER BY.
сортированным_аргументам
Таблица 9.59. Операции группировки
GROUPING(аргументы...)
аргументы...
integer
Операции группировки применяются в сочетании с наборами группирования (см. Подраздел 7.2.4) для различения результирующих строк. Аргументы операции GROUPING на самом деле не вычисляются, но они должны в точности соответствовать выражениям, заданным в предложении GROUP BY на их уровне запроса. Биты назначаются справа налево (правый аргумент отражается в младшем бите); бит равен 0, если соответствующее выражение вошло в критерий группировки набора группирования, для которого сформирована строка результата, или 1 в противном случае. Например:
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)
=>
SELECT * FROM items_sold;
SELECT make, model, GROUPING(make,model), sum(sales) FROM items_sold GROUP BY ROLLUP(make,model);
Соглашаюсь с условиями обработки персональных данных