ГРУППИРОВКА
ГРУППИРОВКА
ROLLUP и CUBE являются модификаторами для GROUP BY. Оба из них рассчитывают промежуточные итоги. ROLLUP принимает упорядоченный список колонок, например (day, month, year)
, и вычисляет промежуточные итоги на каждом уровне агрегации, а затем общий итог. CUBE вычисляет промежуточные итоги для всех возможных комбинаций указанных колонок. Функция GROUPING определяет, какие строки, возвращенные ROLLUP или CUBE, являются суперагрегатами, а какие - это строки, которые были бы возвращены в незмодифицированном GROUP BY.
Функция GROUPING принимает несколько колонок в качестве аргумента и возвращает битовую маску.
1
сигнализирует о том, что строка, возвращенная модификаторомROLLUP
илиCUBE
кGROUP BY
, является промежуточным итогом0
сигнализирует о том, что строка, возвращеннаяROLLUP
илиCUBE
, не является промежуточным итогом
МНОЖЕСТВА ГРУППИРОВКИ
По умолчанию, модификатор 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, как в следующем примере, может быть более подходящим.