← Все вопросы
Как выбрать топ-3 заказа по сумме для каждого пользователя?
20
Не топ-3 вообще, а именно по 3 самых дорогих заказа у КАЖДОГО пользователя. ORDER BY amount DESC LIMIT 3 даёт только 3 на всю таблицу. Как сделать «по каждой группе»?
3 ответа
33
✓ Принятый ответ — помог автору
LIMIT тут не поможет — он режет весь результат целиком. Нужны оконные функции: нумеруем заказы внутри каждого пользователя и берём первые три.
SELECT *
FROM (
SELECT o.*,
ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY amount DESC
) AS rn
FROM orders o
) t
WHERE rn <= 3;
PARTITION BY user_id — это как отдельный мини-ORDER+нумерация для каждого пользователя. rn <= 3 оставляет три верхних в каждой группе.
Ирина Ионцева если нужны ничьи (одинаковая сумма) — бери RANK() вместо ROW_NUMBER() · 7 месяцев назад
12
Фильтровать по rn прямо в том же SELECT, где он объявлен, нельзя — оконные функции считаются после WHERE. Поэтому и заворачивают всё в подзапрос. Частая ошибка новичков.
3
ROW_NUMBER().
Ваш ответ
Войдите, чтобы ответить на вопрос.