Как запросить MAX (SUM (отношение)) в Postgresql?

Я прочитал несколько связанных потоков в StackOverflow, но ни одна из них не решает мою проблему. У меня есть база данных Sales, где мне нужно запросить клиента, который потратил больше всего на покупку товара. Для этого мне нужно найти, кто купил этот продукт, используя

SELECT sum(qty*rate) 
AS exp from salesdetails as s JOIN sales as ss on (ss.invno = s.invno) 
JOIN customer as c ON (ss.customerno = c.custno) GROUP BY(c.name) 
ORDER BY sum(qty*rate);

Он возвращает таблицу с именем человека и то, что он провел в порядке возрастания, как

Вывод команды выше:

Хотя мне действительно нужно только печатать кортеж, когда sum(qty*rate) является максимальной. В настоящее время я получаю результаты по суб-запросам:

SELECT name, sum(qty*rate) FROM salesdetails as s JOIN sales as ss on (ss.invno=s.invno) 
JOIN customer as c ON (ss.customerno = c.custno) GROUP BY(c.name) 
HAVING sum(qty*rate) IN (SELECT max(exp) FROM (SELECT sum(qty*rate) 
AS exp from salesdetails as s JOIN sales as ss on (ss.invno = s.invno) 
JOIN customer as c ON (ss.customerno = c.custno) GROUP BY(c.name) ORDER BY sum(qty*rate)) aa);

Ожидаемый результат:

Есть ли более короткий способ получить выход?

2 ответа

Вы ищете что-то вроде этого:

select * 
from (
 SELECT c.Name, sum(qty*rate) 
 AS exp from salesdetails as s JOIN sales as ss on (ss.invno = s.invno) 
 JOIN customer as c ON (ss.customerno = c.custno) 
 GROUP BY(c.name) 
 ORDER BY sum(qty*rate) desc
 ) t
limit 1;


Вы хотите, чтобы row_number() или distinct on:

SELECT DISTINCT ON (c.name) c.name, sum(qty*rate) AS exp
FROM salesdetails s JOIN
 sales ss
 on (ss.invno = s.invno) JOIN
 customer c
 ON (ss.customerno = c.custno)
GROUP BY c.name
ORDER BY c.name, sum(qty*rate) DESC;

licensed under cc by-sa 3.0 with attribution.