Запрос, который выведет имя покупателя, совершившего покупок на наибольшую сумму за всё время
Собственно, цитирую условие задачи: написать в PostgreSQL запрос, который выведет имя покупателя, совершившего покупок на наибольшую сумму за всё время (в рамках одного заказа может быть несколько разных товаров). База для задачи состоит из трёх таблиц:
- Покупатели - buyers: содержит поля buyer_id (primary key), name, city
- Товары - products: product_id (primary key), product_name, price
- Заказы - orders: order_id (primary key), order_date, buyer_id (foreign key), product_id (primary key), quantity
Мокап БД и запроса: https://onecompiler.com/postgresql/43csjz2v6 В мокапе вроде бы выводит правильно, но тест решение задачи не принимает. Также было подозрение, что я не понимаю условие, и речь не о сумме всех покупок пользователя, а о поиске самой "дорогой" покупки, но такое тоже не прошло. Что я делаю не так?
Код исходного запроса:
WITH total AS (
SELECT buyers.buyer_id, buyers.name, SUM(orders.quantity * products.price) AS total_order
FROM buyers
INNER JOIN orders ON orders.buyer_id = buyers.buyer_id
INNER JOIN products ON products.product_id = orders.product_id
GROUP BY buyers.buyer_id, orders.order_id)
SELECT name FROM (
SELECT name, SUM(total_order) AS sum_bought FROM total
GROUP BY buyer_id, name) AS max_bought
ORDER BY sum_bought DESC LIMIT 1
Ответы (1 шт):
Единственное что вижу - что запрос излишне переусложнён. Второй уровень там не нужен, можно всё одним запросом сделать. Хотя результат вроде бы тот же самый, по крайней мере на этих данных:
SELECT buyers.name
FROM buyers
INNER JOIN orders ON orders.buyer_id = buyers.buyer_id
INNER JOIN products ON products.product_id = orders.product_id
GROUP BY buyers.name
ORDER BY SUM(orders.quantity * products.price) DESC LIMIT 1
P.S. Если вдруг уникальность buyers.name не гарантирована и покупателей с одинаковым именем при этом нужно различать, а не складывать вместе, то в группировку нужно добавить buyers.bayer_id, как у вас и было.
P.P.S. Ну или вот такой вариант группировки от Akina:
SELECT ANY_VALUE(buyers.name)
FROM buyers
INNER JOIN orders ON orders.buyer_id = buyers.buyer_id
INNER JOIN products ON products.product_id = orders.product_id
GROUP BY buyers.buyer_id
ORDER BY SUM(orders.quantity * products.price) DESC LIMIT 1
Хотя онлайн версия postgresql, которая по вашей ссылке, что-то не принимает ANY_VALUE.