#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.