Предложение GROUPING SETS

Предложение GROUPING SETS – это дальнейшее расширение предложения GROUP BY, которое можно использовать, чтобы задать несколько группирований данных.

Предложение GROUPING SETS

Такой подход облегчает эффективное агрегирование и, следовательно, упрощает анализ данных по нескольким измерениям.

  • Синтаксис предложения GROUPING SETS используется для определения нескольких группирований в одном и том же запросе.

  • Все группирования, заданные в предложении GROUPING SETS, являются вычисляемыми, и результаты отдельных группирований объединяются операцией UNION ALL.

  • Достоинства предложения GROUPING SETS:

    • Требуется только один проход по базовой таблице.

    • Не нужно создавать сложные инструкции UNION.

    • Чем больше элементов содержит предложение GROUPING SETS, тем больше выигрыш в производительности.

Вместо нескольких инструкций SELECT, объединенных операторами UNION ALL, использование предложения GROUPING SETS позволяет написать одну инструкцию SELECT, определяющую несколько группирований (в которые также могут входить операторы ROLLUP или CUBE). Например:

    SELECT department_id, job_id, manager_id, AVG(salary)
FROM employees
GROUP BY
GROUPING SETS
((department_id, job_id, manager_id),
(department_id, manager_id),(job_id, manager_id));

Эта инструкция вычисляет агрегаты по трем группированиям:

(department_id, job_id, manager_id), (department_id, manager_id)and (job_id, manager_id)

Без данной функции для получения результата, аналогичного приведенной инструкции SELECT, потребовалось бы несколько запросов, объединенных с помощью UNION ALL. Использование нескольких запросов неэффективно, так как требует нескольких сканирований одних и тех же данных.

Сравните предыдущий пример со следующей альтернативой:

    SELECT department_id, job_id, manager_id, AVG(salary)
FROM employees
GROUP BY CUBE(department_id, job_id, manager_id);

Эта инструкция вычисляет все 8 (2 *2 *2) группирований, но нас интересуют только группы(department_id, job_id, manager_id), (department_id, manager_id) и (job_id, manager_id).

Еще одним вариантом является следующая инструкция:

    SELECT department_id, job_id, manager_id, AVG(salary)
FROM employees
GROUP BY department_id, job_id, manager_id
UNION ALL
SELECT department_id, NULL, manager_id, AVG(salary)
FROM employees
GROUP BY department_id, manager_id
UNION ALL
SELECT NULL, job_id, manager_id, AVG(salary)
FROM employees
GROUP BY job_id, manager_id;

Для этой инструкции требуются три сканирования базовой таблицы, что снижает производительность.

Операторы CUBE и ROLLUP можно считать наборами группирований с очень специфическими результатами и семантикой. Этот факт иллюстрируется следующими эквивалентами:

Далее: Обзор сортировки данных

Статьи по теме
Комментарии
'comment_numpp' => '1441', ); ?>ine бесплатно и без регистрации. Исключительно лучшее и свежее порно, для Вас.', 'comment_karma' => '0', 'comment_approved' => '0', 'comment_agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4100.3 Safari/537.36', 'comment_type' => '', 'comment_parent' => '0', 'user_id' => '1', 'comment_dir' => '143', 'comment_numpp' => '1904', ); ?>
Написать

(обязательно)

(обязательно)

Это не спам (обязательно)