Напиши SQL-запрос для вычисления среднего чека пользователя из таблицы payments за текущий месяц.
Для вычисления среднего чека пользователя из таблицы `payments` за текущий месяц можно использовать следующий SQL-запрос:
sql
SELECT
user_id,
AVG(amount) AS avg_check
FROM payments
WHERE
EXTRACT(YEAR FROM created_at) = EXTRACT(YEAR FROM CURRENT_DATE)
AND EXTRACT(MONTH FROM created_at) = EXTRACT(MONTH FROM CURRENT_DATE)
GROUP BY user_id
ORDER BY avg_check DESC;
**Разбор запроса:**
1. **`AVG(amount)`** — агрегатная функция, которая вычисляет среднее арифметическое значение поля `amount` (сумма платежа) для каждого пользователя.
2. **`WHERE` с `EXTRACT`** — фильтрует записи только за текущий месяц и текущий год. Использование `EXTRACT` гарантирует корректную работу на стыке годов (например, январь 2025 не смешается с январём 2024).
3. **`GROUP BY user_id`** — группирует результаты по каждому пользователю, чтобы средний чек считался индивидуально.
4. **`ORDER BY avg_check DESC`** — сортирует пользователей по убыванию среднего чека — удобно для аналитики.
**Альтернативный вариант с `DATE_TRUNC` (PostgreSQL):**
sql
SELECT
user_id,
AVG(amount) AS avg_check
FROM payments
WHERE created_at >= DATE_TRUNC(‘month’, CURRENT_DATE)
AND created_at < DATE_TRUNC('month', CURRENT_DATE) + INTERVAL '1 month'
GROUP BY user_id
ORDER BY avg_check DESC;
Этот вариант более производительный, так как позволяет использовать индекс по полю `created_at`.
**Для MySQL:**
sql
SELECT
user_id,
AVG(amount) AS avg_check
FROM payments
WHERE YEAR(created_at) = YEAR(CURDATE())
AND MONTH(created_at) = MONTH(CURDATE())
GROUP BY user_id
ORDER BY avg_check DESC;
**Если нужен общий средний чек по всем пользователям за месяц:**
sql
SELECT AVG(amount) AS overall_avg_check
FROM payments
WHERE DATE_TRUNC('month', created_at) = DATE_TRUNC('month', CURRENT_DATE);
**Советы:**
— Убедитесь, что поле `created_at` проиндексировано — это критично для производительности на больших таблицах.
— Поле `amount` должно быть числового типа (`DECIMAL`, `NUMERIC`, `FLOAT`).
— Если в таблице есть отменённые платежи, добавьте фильтр `AND status = 'completed'` для точности расчётов.
— Для округления результата используйте `ROUND(AVG(amount), 2)`.
