Запрос, который выведет имя покупателя, совершившего покупок на наибольшую сумму за всё время

Собственно, цитирую условие задачи: написать в PostgreSQL запрос, который выведет имя покупателя, совершившего покупок на наибольшую сумму за всё время (в рамках одного заказа может быть несколько разных товаров). База для задачи состоит из трёх таблиц:

  1. Покупатели - buyers: содержит поля buyer_id (primary key), name, city
  2. Товары - products: product_id (primary key), product_name, price
  3. Заказы - 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 шт):

Автор решения: CrazyElf

Единственное что вижу - что запрос излишне переусложнён. Второй уровень там не нужен, можно всё одним запросом сделать. Хотя результат вроде бы тот же самый, по крайней мере на этих данных:

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.

→ Ссылка