выберите максимальную сумму пользователя из таблицы, как пользователя с максимальной суммой?

#sql #postgresql #sum #sql-order-by #sql-limit

#sql #postgresql #сумма #sql-order-by #sql-limit

Вопрос:

У меня есть таблица в виде

 create table mock_sales
(
    first_name character varying,
    last_name character varying,
    amount integer
);

insert into mock_sales(first_name, last_name, amount) 
values('ted','mosby', 100),
('lily', 'aldrin', 400),
('ted', 'mosby', 350),
('barney', 'Stinson',180)
  

Желаемый результат

Человек с максимальной суммой

ted mosby // Как сумма ted mosby = 450 (100 350), которая является наибольшей

Я пытался

 Select first_name, last_name from mock_sales group by first_name, last_name where amount in (
select max(amount) from t
(select sum(amount) as amount from mock_sales as t group by first_name, last_name)

or 

select t.first_name, t.last_name from mock_sales where max(amount) == t.amount and t.amount in (
Select first-name, last_name, sum(amount) as amount from mock_sales as t group by first_name, last_name)
  

Но они оба выдавали синтаксические ошибки. Любая помощь будет оценена.

Возникли проблемы с объединением результатов 2 запросов.

Ответ №1:

Вы можете просто группировать записи с одинаковым именем / фамилией, упорядочивать результаты и сохранять только первую строку:

 select first_name, last_name, sum(amount) total_amount
from mock_sales
group by first_name, last_name
order by total_amount desc
limit 1
  

Если вы хотите разрешить связи, то это немного по-другому. В Postgres вы можете использовать оконные функции:

 select *
from (
    select first_name, last_name, sum(amount) total_amount,
        rank() over(order by sum(amount) desc) rn
    from mock_sales
    group by first_name, last_name
) t
where rn = 1
  

Комментарии:

1. Да, это сработает, я беру решение с ограничением 1, но можем ли мы как-то написать этот запрос без использования limit . Или как это будет сравниваться, если мы каким-то образом используем функцию max с точки зрения временной сложности

2. @John: если вы хотите только одну строку и не заботитесь о связях, order by и limit это должно быть наиболее эффективным вариантом. Вы можете протестировать свои реальные данные и посмотреть сами. Для повышения производительности рассмотрите индекс on (first_name, last_name, amount) .

Ответ №2:

Поскольку вам нужна сумма вместо максимального значения so, попробуйте это вместо:

 SELECT first_name,last_name, SUM(amount) AS amount FROM mock_sales 
 GROUP BY first_name,last_name ORDER BY amount DESC LIMIT 1;
  

Комментарии:

1. Я не хочу этого в качестве вывода, я хочу, чтобы ted mosby выводился как (сумма ted mosby 100 350 = 450, больше, чем lily aldrin 400.