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

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