Агрегированные выражения в Greenplum
Агрегированное выражение представляет собой применение агрегатной функции к строкам, выбранным запросом. Агрегатная функция сводит несколько входных данных к одному выходному значению, такому как сумма или среднее значение входов. Синтаксис агрегированного выражения:
aggregate_name (expression [ , ... ] ) [FILTER (WHERE condition)] aggregate_name (ALL expression [ , ... ] ) [FILTER (WHERE condition)] aggregate_name (DISTINCT expression [ , ... ] ) [FILTER (WHERE condition)] aggregate_name ( * ) [FILTER (WHERE condition)]
Где aggregate_name- это ранее определенный агрегат (возможно, с именем схемы), а выражение - это любое выражение значения, которое само не содержит агрегированное выражение.
Первая форма агрегированного выражения вызывает агрегат по всем строкам ввода, для которых данное выражение(я) дает не нулевые значения. Вторая форма аналогична первой, поскольку по умолчанию используется значение ALL. Третья форма вызывает агрегат для всех различных ненулевых значений выражений, найденных во входных строках. Последняя форма вызывает агрегат один раз для каждой строки ввода, независимо от нулевых или ненулевых значений; поскольку конкретное значение ввода не указывается, она обычно полезна только для агрегатной функции count(*) агрегатной функции.
Например, count(*) дает общее количество строк ввода; count(f1) дает количество строк ввода, в которых f1 не является нулем; count(distinct f1) дает количество различных ненулевых значений f1.
Предложение FILTER позволяет задать условие, чтобы ограничить входные строки для агрегатной функции. Например:
SELECT count(*) FILTER (WHERE gender='F') FROM employee;
Условие WHERE в предложении FILTER не может содержать функцию возврата набора, подзапрос, оконную функцию или внешнюю ссылку. При использовании определяемой пользователем агрегатной функция перехода состояния должна быть объявлена как STRICT (см. CREATE AGGREGATE).
Greenplum Database предоставляет специальные агрегированные выражения для обратных функций распределения. Они выглядят следующим образом:
PERCENTILE_CONT(_percentage_) WITHIN GROUP (ORDER BY _expression_) PERCENTILE_DISC(_percentage_) WITHIN GROUP (ORDER BY _expression_)
В настоящее время с ключевым словом WITHIN GROUP используются только эти два выражения. Greenplum Database также предоставляет агрегатную функцию MEDIAN, которая возвращает 50-процентное значение результата PERCENTILE_CONT.
Ограничения агрегированных выражений
Ниже перечислены основные ограничения агрегированных выражений:
- Нельзя использовать эти агрегатные выражения с ключевыми словами ALL, DISTINCT, FILTER и OVER.
- Нельзя использовать эти агрегатные выражения со спецификациями группировки, CUBE, ROLLUP и GROUPING SETS.
- Агрегированное выражение может появляться только в списке результатов или в предложении HAVING команды SELECT. Оно запрещено в других предложениях, таких как WHERE, поскольку эти предложения логически оцениваются до формирования результатов агрегатов.
- Если агрегированное выражение встречается в подзапросе, то обычно оно оценивается по строкам подзапроса. Но есть исключение: если аргументы агрегата содержат только переменные внешнего уровня, тогда агрегат относится к ближайшему внешнему уровню и оценивается по строкам этого запроса. В таком случае агрегированное выражение является внешней ссылкой для подзапроса, в котором оно встречается, и действует как константа при любой оценке этого подзапроса. Ограничение на появление только в списке результатов или в предложении HAVING действует в отношении уровня запроса, к которому принадлежит агрегат.
В настоящее время Greenplum не поддерживает DISTINCT с более чем одним входным выражением.




