Перейти к основному содержимому
Перейти к основному содержимому

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