Menu
Coddy logo textTech

Агрегатные функции

Часть раздела Основы путешествия по SQL на Coddy — урок 68 из 72.

Функции агрегации используются для расчёта AVG() или MAX() или любой другой функции агрегации вплоть до текущей строки.
Например, мы могли бы рассчитать максимальную выручку, полученную до каждого конечного периода:

месяцвыручкарегион
440Восток
520Восток
660Запад
755Запад
861Восток
SELECT month, revenue, MAX(revenue) OVER (ORDER BY month ASC) as max_revenue
from table1

Это вернёт:

месяцвыручкамаксимальная выручка
44040
52040
66060
75560
86161

Для месяцев 4 и 5 максимальная выручка составляет 40, для месяцев 5 и 6 выручка составляет 60, а для месяца 8 — 61. Это потому, что когда оно находит новую большую выручку, оно отбрасывает старую и использует самую большую на данный момент.

Для функции AVG() это будет выглядеть так:

SELECT month, revenue, AVG(revenue) OVER (ORDER BY month ASC) as avg_revenue
from table1
месяцвыручкасредняя выручка
44040
52030
66040
75543.75
86147.2

Мы также можем группировать наши вычисления по конкретным категориям с использованием PARTITION BY. Например:

SELECT month, revenue, region,
MAX(revenue) OVER (PARTITION BY region ORDER BY month ASC) as max_revenue
FROM table1

Это даст нам:

monthrevenueregionmax_revenue
440Восток40
520Восток40
660Запад60
755Запад60
861Восток61

Теперь максимум рассчитывается отдельно для каждого региона. Регион Восток и регион Запад поддерживают свои собственные текущие максимумы независимо.

challenge icon

Задание

Легко

Доступные таблицы и столбцы:

  • <strong>books</strong>: <strong>book</strong>, <strong>page</strong>, <strong>words</strong>

Для каждой книги выведите название книги, общее количество её страниц, количество слов на каждой странице и рассчитайте:

  1. Максимальное количество слов, найденное на любой странице этой книги
  2. Среднее количество слов на страницу для всей книги
  3. Разницу между количеством слов на текущей странице и средним количеством слов на страницу книги

Отобразите результаты, упорядоченные по книге и номеру страницы.

Верните следующие столбцы:

  • book
  • page
  • words
  • max_words_in_book
  • avg_words_per_page
  • diff_from_avg

Шпаргалка

Оконные функции с агрегацией вычисляют значения по набору строк, связанных с текущей строкой. Используйте клаузу OVER с ORDER BY для накопительных вычислений:

SELECT column, 
       MAX(column) OVER (ORDER BY column ASC) as running_max,
       AVG(column) OVER (ORDER BY column ASC) as running_avg
FROM table

Используйте PARTITION BY для группировки вычислений по категориям:

SELECT column, category,
       MAX(column) OVER (PARTITION BY category ORDER BY column ASC) as max_per_category
FROM table

Это вычисляет максимум отдельно для каждой категории, поддерживая независимые накопительные вычисления.

Попробуйте сами

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы