【问题标题】:how to group by getting the highest amount while keeping the row values如何在保持行值的同时通过获得最高数量进行分组
【发布时间】:2015-01-10 06:06:29
【问题描述】:

您如何获得相同Bar 中具有最高Amount 的行。我有这个样本数据。

Foo | Bar | Amount
1   | A   | 0
43  | A   | 120
1   | B   | 0
43  | B   | 120
1   | C   | 0
43  | C   | 105

预期结果

Foo | Bar | Amount
1   | A   | 0
43  | A   | 120

Foo | Bar | Amount
1   | B   | 0
43  | B   | 120

以上两个都可以,因为我只需要最高的Amount。我有这个查询,但似乎不正确。

select
    Foo
    ,max(Bar) as Bar
    ,max(Amount) as Amount
from Table1
group by Foo

我得到了

Foo | Bar | Amount
1   | C   | 0
43  | C   | 120

结果应该保持连续的值。

任何帮助将不胜感激。 谢谢

【问题讨论】:

    标签: sql sql-server aggregate-functions


    【解决方案1】:

    您将 MAx 应用于字符串,因此它将获得最后一个。如果你想获得 A,你应该使用 MIN。

    编辑:

    根据您的评论,以下将起作用;

    WITH CTE as(
    Select t1.Bar from #TBL1 t1
    where t1.Amount = (Select MAX(Amount) From #TBL1)
    group by t1.Bar)
    Select t1.* From CTE ct
    join #TBL1 t1
    on t1.Bar = ct.Bar
    

    只需将#TBL 替换为您的表名即可。

    【讨论】:

    • 是的。使用min() 可以解决问题,但如果您要查找的结果在中间怎么办?
    【解决方案2】:

    使用下面的

    SELECT TOP 1
     Foo ,
     Bar,
     Amount
    FROM Table1
    order by 
    Amount desc
    ,Bar asc
    

    【讨论】:

    • 谢谢,但结果应该在相同的Bar 中获得最高数量的行,同时保留行值
    【解决方案3】:

    如果任何一个具有最大“金额”的“条形”行都可以, 希望下面的查询有帮助..

    select * from table1 where bar in (
      select bar
      from(
        select bar,max(amount) maxim
        from table1 
        group by bar
        order by maxim desc
      ) where rownum =1
    );
    

    编辑:

     select * from table1 where bar in (
          select bar
          from(
    Select top(1) bar,maxim from (
            select bar,max(amount) maxim
            from table1 
            group by bar
            order by maxim desc
          )) 
        );
    

    【讨论】:

    • rownumber = 1 出现错误。我错过了什么?
    • 哦..这个查询在oracle中测试过..需要在Sql server中获取rownum的替代品。
    【解决方案4】:

    首先,计算AmountBar的最大值:

    SELECT
      Foo,
      Bar,
      Amount,
      MaxAmount = MAX(Amount) OVER (PARTITION BY Bar)
    FROM
      dbo.Table1
    ;
    

    对于您的示例,上述查询将返回此结果集:

    Foo  Bar  Amount  MaxAmount
    ---  ---  ------  ---------
    1    A    0       120
    43   A    120     120
    1    B    0       120
    43   B    120     120
    1    C    0       105
    43   C    105     105
    

    现在使用ORDER BY MaxAmount DESC, Bar ASC(或... Bar DESC)并将TOP (1) WITH TIES应用于结果以返回一个仅代表一个Bar的子集:

    SELECT TOP (1) WITH TIES
      Foo,
      Bar,
      Amount,
      MaxAmount = MAX(Amount) OVER (PARTITION BY Bar)
    FROM
      dbo.Table1
    ORDER BY
      MaxAmount DESC,
      Bar ASC
    ;
    

    第一个排序条件导致查询返回具有最大 Amount 值的 BarBars。如果有多个具有相同的最大值,则需要第二个以确保只返回一个 Bar

    返回的行没有保证的顺序。如果需要,请将第二个查询用作派生表,并根据需要再次对结果进行排序:

    SELECT
      ...
    FROM
      (
        SELECT TOP (1) WITH TIES
          Foo,
          Bar,
          Amount,
          MaxAmount = MAX(Amount) OVER (PARTITION BY Bar)
        FROM
          dbo.Table1
        ORDER BY
          MaxAmount DESC,
          Bar ASC
      ) AS s
    ORDER BY
      ...
    ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 2017-05-22
      相关资源
      最近更新 更多