Функция AVG() в SQL: среднее арифметическое как агрегат и как оконная функция

AVG() возвращает среднее арифметическое значений столбца. Как агрегат она сворачивает группу в одно число (часто с GROUP BY), а с оператором OVER превращается в оконную функцию и считает, например, скользящее среднее по датам. Функция игнорирует NULL — они не попадают ни в сумму, ни в знаменатель, поэтому результат может отличаться от ручного SUM/COUNT(*). Синтаксис одинаков в PostgreSQL, MySQL и SQLite.

Синтаксис

AVG(выражение) / AVG(выражение) OVER (PARTITION BY ... ORDER BY ... ROWS BETWEEN ...)

Примеры использования

Пример 1: Средний чек по всем заказам

SELECT ROUND(AVG(amount), 2) AS avg_check
FROM orders;

Результат:

avg_check
---------
1425.50

Пример 2: Средний чек по каждому пользователю

SELECT user_id, ROUND(AVG(amount), 2) AS avg_check
FROM orders
GROUP BY user_id
ORDER BY avg_check DESC;

Результат:

user_id | avg_check
--------+----------
42      | 3100.00
17      | 1890.50
8       | 1240.00

Пример 3: Скользящее среднее за 7 дней (оконная)

SELECT
  order_date,
  amount,
  ROUND(AVG(amount) OVER (
    ORDER BY order_date
    ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
  ), 2) AS ma7
FROM orders;

Результат:

order_date | amount  | ma7
-----------+---------+---------
2026-05-01 | 1200.00 | 1200.00
2026-05-02 | 1600.00 | 1400.00
2026-05-03 |  900.00 | 1233.33
Порешать SQL-задачи в тренажёре →

Типичная ошибка

AVG() пропускает NULL — если нужно считать их нулями, оборачивай в AVG(COALESCE(x, 0)) или считай SUM(x)/COUNT(*) вручную. В PostgreSQL AVG() по целочисленному столбцу возвращает numeric без обрезания, в SQLite — всегда float, в MySQL — decimal; для аккуратного вывода используй ROUND.

Где спрашивают на собеседовании

Спрашивают, когда нужно посчитать средний чек или скользящее среднее; на собесе часто просят объяснить, почему AVG(x) не равно SUM(x)/COUNT(*) при наличии NULL. Идёт в паре с GROUP BY и оконным OVER (... ROWS BETWEEN ...).

FAQ: частые вопросы про AVG

Учитывает ли AVG() значения NULL?

Нет, NULL полностью игнорируются: они не входят ни в сумму, ни в количество. Поэтому AVG(x) равно SUM(x)/COUNT(x), но не SUM(x)/COUNT(*). Чтобы считать NULL как ноль, используйте AVG(COALESCE(x, 0)).

Как посчитать скользящее среднее с помощью AVG()?

Добавьте OVER с сортировкой и рамкой: AVG(amount) OVER (ORDER BY order_date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) даёт среднее за 7 строк. Так AVG работает как оконная функция и не сворачивает строки в одну.

Округляет ли AVG() результат до целого?

Зависит от диалекта. В PostgreSQL AVG() по integer-столбцу возвращает numeric без обрезания, в SQLite — float, в MySQL — decimal. Целочисленного деления, как у обычного оператора /, здесь нет; для нужного числа знаков применяйте ROUND.

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы SQL

Агрегации · Оконные функции

Другие функции SQL

ROW_NUMBER · RANK · DENSE_RANK · LAG · LEAD · NTILE

Открыть SQL-тренажёр (565 задач) →