Суммируйте amount по клиенту, упорядочьте по убыванию суммы и возьмите первые десять строк. COUNT(*) считал бы позиции, а не количество единиц товара.
10 клиентов с наибольшим числом товаров в корзине
Суммируйте amount по клиенту, упорядочьте по убыванию суммы и возьмите первые десять строк. COUNT(*) считал бы позиции, а не количество единиц товара.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В базе присутствуют две таблицы public.customer и public.carts. Необходимо получить список из десяти клиентов (столбцы: id, email), у которых суммарное количество товаров в корзине (учитывая поле amount) максимально.
Table "public.carts"
+-------------+-----------------------------+-------------------------+
| Column | Type | Modifiers |
+-------------+-----------------------------+-------------------------+
| sku | bigint | not null |
| country | country_enum | not null |
| customer_id | bigint | not null |
| amount | bigint | not null |
| updated_at | timestamp without time zone | default now() not null |
+-------------+-----------------------------+-------------------------+
Table "public.customer"
+--------+--------+----------+
| Column | Type | Modifiers |
+--------+--------+----------+
| id | bigint | not null |
| email | text | not null |
+--------+--------+----------+
Ответ
Суммируйте amount по клиенту, упорядочьте по убыванию суммы и возьмите первые десять строк. COUNT(*) считал бы позиции, а не количество единиц товара.
Для клиентов с записями корзины:
SELECT c.id, c.email
FROM public.customer AS c
JOIN public.carts AS cart ON cart.customer_id = c.id
GROUP BY c.id, c.email
ORDER BY SUM(cart.amount) DESC, c.id
LIMIT 10;
Дополнительная сортировка по id делает выбор при равных суммах устойчивым. Если нужно включить клиентов без корзины с нулевой суммой, используйте LEFT JOIN и COALESCE. Корректность количества предполагает согласованные правила для нулевых и отрицательных amount.