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

ГРУППИРОВКА

ГРУППИРОВКА

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