GROUPING
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)
, предоставляет иерархию, которая может не иметь смысла. Не имеет смысла рассматривать Версию для двух дистрибутивов (так как Arch и RHEL не имеют одного цикла выпуска или стандартов именования версий). Пример с GROUPING SETS, следующий за этим, более уместен, так как он группирует distro
и version
в одном наборе.
Версия в примере выше может не иметь смысла, если она не связана с дистрибутивом, если бы мы отслеживали версию ядра, это могло бы иметь смысл, потому что версия ядра может быть связана с любым дистрибутивом. Использование GROUPING SETS, как в следующем примере, может быть лучшим выбором.