【问题标题】:select max sum of user from table, as user with maximum amount?从表中选择用户的最大总和,作为最大数量的用户?
【发布时间】:2021-01-06 18:11:51
【问题描述】:

我有一张桌子

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 // As ted mosby sum = 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 个查询的结果时遇到问题。

【问题讨论】:

    标签: sql postgresql sum sql-order-by sql-limit


    【解决方案1】:

    既然你想要总和而不是最大值,那么试试这个:

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

    【讨论】:

    • 我不希望它作为输出,我希望 ted mosby 作为输出(ted mosby 100 + 350 = 450 的总和,大于 lily aldrin 400。
    【解决方案2】:

    您可以只对具有相同名字/姓氏的记录进行分组,对结果进行排序并仅保留第一行:

    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 的解决方案,但是我们可以在不使用限制的情况下以某种方式编写此查询。或者如果我们以某种方式在时间复杂度方面使用 max 函数,它将如何比较
    • @John:如果你只想要一行而不关心关系,order bylimit 应该是最有效的选择。您可以针对您的真实数据进行测试并自己查看。为了提高性能,请考虑在(first_name, last_name, amount) 上建立索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 2013-12-06
    相关资源
    最近更新 更多