Короткий ответ
Сначала GROUP BY customer_id формирует одну строку на клиента, затем SUM(amount) вычисляет объём покупок. ORDER BY ... DESC ставит крупнейшие суммы первыми, а LIMIT 10 оставляет десять строк.
Как это работает подробнее
Ограничение без сортировки не означает топ: без ORDER BY СУБД вправе вернуть произвольные строки. Для воспроизводимого результата при одинаковых суммах добавьте уникальный вторичный критерий.
Если бизнес-задача требует включить всех клиентов, разделивших десятое место, фиксированный LIMIT 10 не подходит. Тогда используют RANK или DENSE_RANK и фильтр по рангу.
Пример кода
query.sql
SELECT customer_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
ORDER BY total_amount DESC, customer_id ASC
LIMIT 10;Что использовать на практике
- Обычный топ-10. Применяйте стабильную сортировку и
LIMIT 10. - Топ с ничьими. Рассчитайте ранг по сумме в CTE и оставьте ранг не больше десяти.
Подводные камни
- NULL в сумме. Если все значения клиента равны
NULL, итоговая сумма тоже будетNULL. - Размножение до агрегации. Неверное соединение способно завысить сумму клиента.