SELECT ROUND(AVG(amount), 2) AS avg_check
FROM orders;
Результат:
avg_check --------- 1425.50
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
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(x) не равно SUM(x)/COUNT(*) при наличии NULL. Идёт в паре с GROUP BY и оконным OVER (... ROWS BETWEEN ...).
Нет, NULL полностью игнорируются: они не входят ни в сумму, ни в количество. Поэтому AVG(x) равно SUM(x)/COUNT(x), но не SUM(x)/COUNT(*). Чтобы считать NULL как ноль, используйте AVG(COALESCE(x, 0)).
Добавьте OVER с сортировкой и рамкой: AVG(amount) OVER (ORDER BY order_date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) даёт среднее за 7 строк. Так AVG работает как оконная функция и не сворачивает строки в одну.
Зависит от диалекта. В PostgreSQL AVG() по integer-столбцу возвращает numeric без обрезания, в SQLite — float, в MySQL — decimal. Целочисленного деления, как у обычного оператора /, здесь нет; для нужного числа знаков применяйте ROUND.
ROW_NUMBER · RANK · DENSE_RANK · LAG · LEAD · NTILE
Открыть SQL-тренажёр (565 задач) →