🧠 Условие:
Есть таблица
orders:| id | customer_id | total |
|----|-------------|--------|
| 1 | A | 100.00 |
| 2 | A | 200.00 |
| 3 | B | 150.00 |
| 4 | B | 300.00 |
| 5 | C | 400.00 |Нужно выбрать заказ с максимальной суммой (`total`) для каждого клиента.
Вы пишете:
SELECT customer_id, MAX(total)
FROM orders
GROUP BY customer_id;
✅ Работает? Да. Но теперь вы хотите вернуть всю строку заказа с максимальной суммой — включая id.
Вы пишете:
SELECT *
FROM orders
GROUP BY customer_id
HAVING total = MAX(total);
❌ Ошибка. Или — неожиданные результаты.
📌 Подвох: нельзя использовать HAVING total = MAX(total) без подзапроса.
MAX — агрегат, а total вне GROUP BY — это ошибка или неопределённость.
✅ Правильное решение — с подзапросом:
SELECT o.*
FROM orders o
JOIN (
SELECT customer_id, MAX(total) AS max_total
FROM orders
GROUP BY customer_id
) t ON o.customer_id = t.customer_id AND o.total = t.max_total;
💡 Такое решение:
🟢Возвращает всю строку заказа с максимальной суммой
🟢Работает корректно даже при одинаковых суммах у нескольких заказов
🟢Избегает путаницы с агрегатами в основном SELECT
🧠 Вывод:
Нельзя просто так использовать MAX() и при этом возвращать столбцы вне GROUP BY.
Для этого всегда нужен JOIN с агрегатом или window-функции.