Напиши SQL-запрос для выборки 10 самых активных пользователей по количеству отправленных сообщений за месяц.

Для выборки 10 самых активных пользователей по количеству отправленных сообщений за текущий месяц можно использовать следующий SQL-запрос:

sql
SELECT
u.id AS user_id,
u.username,
COUNT(m.id) AS message_count
FROM users u
JOIN messages m ON m.user_id = u.id
WHERE m.created_at >= DATE_TRUNC(‘month’, CURRENT_DATE)
AND m.created_at = DATE_TRUNC(‘month’, CURRENT_DATE)** — фильтрация сообщений, начиная с первого дня текущего месяца. Функция `DATE_TRUNC` работает в PostgreSQL; для MySQL используйте `DATE_FORMAT(m.created_at, ‘%Y-%m’) = DATE_FORMAT(NOW(), ‘%Y-%m’)`.
4. **COUNT(m.id) AS message_count** — подсчёт количества сообщений для каждого пользователя.
5. **GROUP BY u.id, u.username** — группировка результатов по пользователю.
6. **ORDER BY message_count DESC** — сортировка по убыванию активности.
7. **LIMIT 10** — ограничение выборки десятью записями.

**Вариант для MySQL:**
sql
SELECT
u.id AS user_id,
u.username,
COUNT(m.id) AS message_count
FROM users u
JOIN messages m ON m.user_id = u.id
WHERE YEAR(m.created_at) = YEAR(NOW())
AND MONTH(m.created_at) = MONTH(NOW())
GROUP BY u.id, u.username
ORDER BY message_count DESC
LIMIT 10;

**Вариант для SQL Server:**
sql
SELECT TOP 10
u.id AS user_id,
u.username,
COUNT(m.id) AS message_count
FROM users u
JOIN messages m ON m.user_id = u.id
WHERE m.created_at >= DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)
AND m.created_at < DATEADD(month, DATEDIFF(month, 0, GETDATE()) + 1, 0)
GROUP BY u.id, u.username
ORDER BY message_count DESC;

**Строка для CSV:**

user_id,username,message_count

Пример данных одной строки результата:

42,ivan_petrov,318

**Рекомендации по оптимизации:**
— Добавьте индекс на поле `messages.created_at` и `messages.user_id` для ускорения выборки.
— Если таблица сообщений очень большая, рассмотрите партиционирование по дате.
— При необходимости учитывайте только уникальные сообщения (без дублей) — используйте `COUNT(DISTINCT m.id)`.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.