Данная статья относится к циклу статей, посвященных PostgreSQL. В предыдущей статье мы говорили об условии PostgreSQL GROUPING SETS. Теперь же мы углубимся в изучение подкласса CUBE, который используется для создания нескольких групповых наборов.
Введение в подкласс PostgreSQL CUBE
PostgreSQL CUBE является подклассом условия GROUP BY и позволяет генерировать несколько групповых наборов.
Групповой набор — это набор столбцов, по которым осуществляется группировка. Для получения дополнительной информации о группировках, советуем изучить следующее руководство.
Запрос ниже отображает синтаксис вызова подкласса CUBE:
SELECT
c1,
c2,
c3,
aggregate (c4)
FROM
table_name
GROUP BY
CUBE (c1, c2, c3);
Детальнее рассмотрим данный вызов:
- Во-первых, мы указываем подкласс CUBE в условии GROUP BY оператора SELECT.
- Во-вторых, в списке выбора мы указываем столбцы (измерения или столбцы измерений), которые вам необходимо проанализировать, а также агрегированные выражения функций.
- В-третьих, в условии GROUP BY мы указываем столбцы измерения в скобках подкласса CUBE.
Запрос генерирует все возможные групповые наборы на основе столбцов измерения, указанных в CUBE.
Использование подкласса CUBE — это простой способ позволяющий определить несколько групповых наборов, поэтому следующие условия эквивалентны:
CUBE(c1,c2,c3)
GROUPING SETS (
(c1,c2,c3),
(c1,c2),
(c1,c3),
(c2,c3),
(c1),
(c2),
(c3),
()
)
В общем, если количество столбцов, указанное в CUBE, равно n, то у вас будет 2^n комбинаций.
Чтобы уменьшить количество вычисляемых агрегатов, PostgreSQL позволяет вам выполнить частичный запрос CUBE. Ниже показан синтаксис:
SELECT
c1,
c2,
c3,
aggregate (c4)
FROM
table_name
GROUP BY
c1,
CUBE (c1, c2);
Примеры использования подкласса PostgreSQL CUBE
Для наглядности мы воспользуемся таблицей sales из урока по GROUPING SETS.
Следующий запрос использует подкласс CUBE для создания нескольких групповых наборов:
SELECT
brand,
segment,
SUM (quantity)
FROM
sales
GROUP BY
CUBE (brand, segment)
ORDER BY
brand,
segment;
Пример вывода:
Следующий запрос выполняет частичный запрос CUBE:
SELECT
brand,
segment,
SUM (quantity)
FROM
sales
GROUP BY
brand,
CUBE (segment)
ORDER BY
brand,
segment;
На этом мы заканчиваем изучение подкласса CUBE и переходим к подклассу ROLLUP.
Источник: PostgreSQL Tutorial from Scratch