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

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