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