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, как в следующем примере, может быть лучшим выбором.