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