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;
我不知道如何选择quantity
、pending
和update_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中具有最大值的完整行的主要内容,如果未能解决你的问题,请参考以下文章
SQL选择列的总和最大的行(在GROUP BY中有两个字段)