Перейти к основному содержимому
Модуль 13 · Урок 1 из 449/57 в курсе~15 min
Уроки модуля (1/4)

Введение и предложение OVER

Введение и пункт OVER

В предыдущих уроках мы увидели, как использовать GROUP BY для агрегирования данных. Однако у GROUP BY есть огромное ограничение: он сворачивает строки. Если вы сгруппируете данные по городам, вы получите одну строку для каждого города и потеряете сведения об отдельных клиентах.

Именно здесь в игру вступают Оконные функции. Они позволяют выполнять совокупные вычисления (например, суммы или средние значения) с сохранением исходных строк.

Предложение OVER()

Волшебное ключевое слово — OVER(). Он сообщает базе данных, что агрегатную функцию (например, SUM, AVG, COUNT) следует рассматривать как оконную функцию, вычисляемую по всему набору результатов (глобальное «окно»), но применяемую и возвращаемую для каждой отдельной строки.

SQL
SELECT
  order_id,
  total_amount,
  AVG(total_amount) OVER() AS global_average
FROM orders;

В этом примере мы сохраняем каждый отдельный заказ, но в каждой строке также есть столбец global_average со средним значением всех заказов. Очень полезно, например, измерить, насколько заказ отклоняется от среднего!

Упражнение#sql.m13.l1.e1
Попыток: 0Загрузка…

В таблице «Продукты» выберите столбец «цена». Добавьте столбец с именем «global_max_price», содержащий максимальную цену, рассчитанную с помощью оконной функции для всей таблицы.

Загрузка редактора…
Показать подсказку

Используйте MAX(цена) в сочетании с OVER().

Решение доступно после 3 попыток

Упражнение#sql.m13.l1.e2
Попыток: 0Загрузка…

Извлеките «id», «цену» и добавьте общую среднюю цену («global_avg») из таблицы «products».

Загрузка редактора…
Показать подсказку

Просто добавьте AVG(цена) OVER().

Решение доступно после 3 попыток