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