Вступить в клуб →
средняявопросSQL для аналитики

Последний заказ на клиента: RANK при одинаковых датах

Для витрины нужна ровно одна строка на клиента — его самый свежий заказ. У части клиентов два заказа имеют одинаковый created_at (оформлены пакетом).

SELECT *
FROM (
  SELECT o.*,
         RANK() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS rn
  FROM orders o
) t
WHERE rn = 1;

Что получится?

  • У клиентов с одинаковым created_at вернётся несколько строк — здесь нужен ROW_NUMBER
  • Ровно по одной строке на клиента: RANK и ROW_NUMBER в такой конструкции дают одинаковую нумерацию
  • Клиенты с ничьёй выпадут из результата: RANK присвоит им значение 2
  • Ошибку: фильтр по оконной функции нужно писать в HAVING, а не в WHERE подзапроса

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела