Аналитические, группирующие и хранимые функции в Greenplum
GPDB поддерживает ряд встроенных агрегатных функций. GPDB работает лучше, когда речь идет об операциях над набором записей. 1 план запроса для всего набора записей против 1 основного плана запроса + 1 на строку.
Все они являются расширениями стандартного предложения GROUP BY:
GROUP BY ROLLUP ( col1, col2, col3 ) GROUP BY CUBE ( col1, col2, col3 ) GROUP BY GROUPING SETS( (c1, c2), (c1, c3))
GPDB поддерживает аналитические и оконные функции, которые используются для применения агрегирования над разделами результирующего набора. Например, sum( population ) over ( partition by city ).
Они также могут использоваться для получения номеров строк, которые могут быть полезны. Например, row_number() over ( order by id ).
Функции достаточно мощны и выполняют всю работу «в базе данных», обеспечивая преимущества в скорости (по сравнению с внешними инструментами).
Традиционный запрос
select a.clientID, a.amount, a.amount/b.sum_amount from orders a inner join (select clientid, sum(amount) sum_amount from orders group by clientid) b on a.clientid = b.clientid
Аналитический запрос
select a.clientid, a.amount, a.amount/(sum(a.amount) over (partition by a.clientid)) , a.amount/(sum(a.amount) over ()) from orders a
Примечание: функционал “roll-up”
Оконные функции
Предложение WINDOW используется для определения окна, которое может быть использовано в выражении OVER() оконной функции, такой как rank или avg. Информацию о расширениях OLAP и оконных функциях см. в справочном руководстве GPDB. Предложение WINDOW используется для определения окна, которое может быть использовано в выражении OVER() оконной функции, такой как rank или avg. Информацию о расширениях OLAP и оконных функциях см. в справочном руководстве GPDB.
select a.clientid, first_value(a.purchase_date) over (partition by a.client_id order by a.purchase_date), sum(a.amount) over (partition by a.client_id order by a.purchase_date rows unbounded preceding) from orders a
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - то же самое, что и ROWS UNBOUNDED PRECEDING
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING




