Короткий ответ
Нужно сначала посчитать максимальную сумму заказа на каждого клиента в отдельном подзапросе (GROUP BY customer_id), а затем присоединить исходную таблицу заказов к этому подзапросу по customer_id и совпадению суммы с максимумом.
Как это работает подробнее
подзапрос SELECT customer_id, MAX(amount) AS max_amount FROM orders GROUP BY customer_id возвращает одну строку на клиента с его максимальной суммой; соединение этого результата с исходной таблицей по customer_id и amount = max_amount оставляет только те строки заказов, которые действительно равны этому максимуму.
Пример кода
question-36.sql
SELECT o.*
FROM orders o
JOIN (
SELECT customer_id, MAX(amount) AS max_amount
FROM orders
GROUP BY customer_id
) m ON o.customer_id = m.customer_id AND o.amount = m.max_amount;Что использовать на практике
- если несколько заказов одного клиента имеют одинаковую максимальную сумму, такой подход вернёт их все — это нужно явно учитывать и решать, что требуется в задаче: «все заказы с максимальной суммой» или «ровно один, самый ранний/последний из них». Результат — для каждого клиента одна или несколько строк с максимальной суммой заказа. Проверка: для одного клиента вручную найти максимум среди его заказов и сверить со значением в результате.
Подводные камни
- пытаются добавить другие столбцы заказа (например,
order_date) напрямую вSELECTрядом сMAX(amount)безGROUP BYпо ним — это либо вызывает ошибку, либо (в некоторых СУБД) возвращает несогласованную комбинацию полей из разных строк одной группы.