Перейти к основному содержанию

GROUPING

ROLLUP и CUBE — это модификаторы для GROUP BY. Оба вычисляют промежуточные итоги. ROLLUP принимает упорядоченный список столбцов, например (day, month, year), и вычисляет промежуточные итоги на каждом уровне агрегации, а затем общий итог. CUBE вычисляет промежуточные итоги для всех возможных комбинаций указанных столбцов. GROUPING определяет, какие строки, возвращаемые ROLLUP или CUBE, являются суперагрегатами, а какие — строками, которые вернул бы GROUP BY без модификаторов. Функция GROUPING принимает несколько столбцов в качестве аргумента и возвращает битовую маску.
  • 1 указывает, что строка, возвращаемая модификатором ROLLUP или CUBE в GROUP BY, является промежуточным итогом
  • 0 указывает, что строка, возвращаемая ROLLUP или CUBE, не является промежуточным итогом

GROUPING SETS

По умолчанию модификатор CUBE вычисляет промежуточные итоги для всех возможных комбинаций столбцов, переданных в CUBE. GROUPING SETS позволяет указать, для каких именно комбинаций выполнять вычисления. Анализ иерархических данных — хороший сценарий использования модификаторов ROLLUP, CUBE и GROUPING SETS. В этом примере используется таблица с данными о том, какие дистрибутивы Linux и их версии установлены в двух датацентрах. Эти данные может быть полезно анализировать по дистрибутиву, версии и местоположению.

Загрузите пример данных

Простые запросы

Подсчитайте количество серверов в каждом дата-центре по дистрибутивам:

Сравнение нескольких команд GROUP BY с GROUPING SETS

Разбиение данных без CUBE, ROLLUP или GROUPING SETS:
Ту же информацию можно получить с помощью GROUPING SETS:

Сравнение CUBE и GROUPING SETS

CUBE в следующем запросе, CUBE(datacenter,distro,version), задает иерархию, которая может быть не вполне осмысленной. Нет смысла сравнивать Version между двумя дистрибутивами одновременно, поскольку у Arch и RHEL разные циклы выпуска и разные стандарты именования версий. Пример с GROUPING SETS, приведенный ниже, здесь уместнее, так как distro и version группируются в одном наборе.
Версия в приведённом выше примере может быть не слишком осмысленной, если она не привязана к дистрибутиву. Если бы мы отслеживали версию ядра, это имело бы больше смысла, поскольку версия ядра может относиться к любому дистрибутиву. В таком случае лучше использовать GROUPING SETS, как в следующем примере.
Последнее изменение 19 июня 2026 г.