【问题标题】:SQL select complete row with largest value in GROUP BYSQL选择GROUP BY中具有最大值的完整行
【发布时间】:2021-05-20 15:48:05
【问题描述】:

给定下表:

account item quantity pending sequence update_time
1 1 20.0 0.0 1 (some time)
2 1 10.0 0.0 2 (some time)
3 1 100.0 0.0 3 (some time)
1 1 20.0 5.0 4 (some time)
2 1 10.0 10.5 4 (some time)
3 1 100.0 100.0 6 (some time)
1 1 25.0 0.0 7 (some time)
2 1 20.5 0.0 8 (some time)
3 1 200.0 0.0 9 (some time)

我想创建一个查询,返回由account, item分组的最高sequence的完整行

以上数据的报表结果应为:

account item quantity pending sequence update_time
1 1 25.0 0.0 7 (some time)
2 1 20.5 0.0 8 (some time)
3 1 200.0 0.0 9 (some time)

目前我知道的最好的方法是:

select account, item , max(sequence) from foo group by account, item;

我不知道如何选择quantitypendingupdate_time 作为顶部序列的第一行。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    在 Postgres 中,最好的方法是使用distinct on

    select distinct on (account, item) t.*
    from t
    order by account, item, sequence desc
    

    【讨论】:

      【解决方案2】:

      你需要使用window function:

      select * from 
      ( 
        select * , row_number() over (partition by account,item order by sequence desc) rn
        from foo
      ) t
      where rn = 1
      

      【讨论】:

        【解决方案3】:

        最终,结果将按数量、待处理和更新时间以及帐户和项目分组(如果您也想拥有这些列)。因为在分组操作的基础上,只会发生任何聚合。因此,您可以直接选择所有所需的列并对所有这些列进行分组(这将是一种更简单的方法)

        select account, item, quantity, pending, update_time, max(sequence) from foo group by account, item, quantity, pending, update_time;

        所以上面的查询所做的是,它将按帐户、项目、数量、挂起和更新时间以及它将针对特定组合获得的记录进行分组,查询将从中获取最大序列并给出结果。

        【讨论】:

          猜你喜欢
          • 2018-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多