SQL选择GROUP BY中具有最大值的完整行

Posted

技术标签:

【中文标题】SQL选择GROUP BY中具有最大值的完整行【英文标题】:SQL select complete row with largest value in 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 作为顶部序列的第一行。

【问题讨论】:

【参考方案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;

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

【讨论】:

以上是关于SQL选择GROUP BY中具有最大值的完整行的主要内容,如果未能解决你的问题,请参考以下文章

在 GROUP BY 中选择具有最大日期的整行

SQL选择列的总和最大的行(在GROUP BY中有两个字段)

在 SQL 中选择不在 Group By 中的列

sql查询中如何用group by查询出完整的一行记录?

sql语言 怎么求每组最大,就是用group by 分组后,求每组某列最大?

SQL group by 后查某字段最大值