← Все вопросы

Как выбрать топ-3 заказа по сумме для каждого пользователя?

Задан 8 месяцев назад888 просмотров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().

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект