GROUP BY ID 并选择 MAX
Posted
技术标签:
【中文标题】GROUP BY ID 并选择 MAX【英文标题】:GROUP BY ID and select MAX 【发布时间】:2021-08-02 23:26:33 【问题描述】:晚上好, 我正在 Oracle 中处理这样的表:
ID | BALANCE | SEQ |
---|---|---|
1 | 102 | 13 |
1 | 119 | 15 |
2 | 50 | 4 |
3 | 20 | 11 |
3 | 15 | 10 |
3 | 45 | 9 |
4 | 90 | 5 |
5 | 67 | 20 |
5 | 12 | 19 |
6 | 20 | 1 |
我想为每个 ID 选择具有 MAX(SEQ) 的 BALANCE。
所以最终结果是:
ID | BALANCE | SEQ |
---|---|---|
1 | 119 | 15 |
2 | 50 | 4 |
3 | 20 | 11 |
4 | 90 | 5 |
5 | 67 | 20 |
6 | 20 | 1 |
我该怎么做? 我已经尝试了几个 Group by 查询,但没有成功。 感谢您的帮助
【问题讨论】:
除了问题之外,您还应该包括到目前为止您所拥有的代码(努力回答您的问题/问题,因为Stack Overflow 不是代码编写服务)。在doing more research 之后,如果您有问题,您可以发布您尝试过的内容,并清楚地解释什么不起作用,并提供一个minimal reproducible example 。我建议阅读How do I ask a Good Question 和Writing the Perfect Question。另外,请务必使用tour。 我无法发布查询,因为我正在处理的表已经是一个长查询的结果,我需要在其中添加我在这里询问的逻辑。 【参考方案1】:一种方法是使用keep
聚合:
select id,
max(balance) keep (dense_rank first order by seq desc) as balance,
max(seq)
from t
group by id;
【讨论】:
【参考方案2】:您可以使用普通的rank()
SELECT ID, BALANCE, SEQ FROM (
select
ID, BALANCE, SEQ, RANK() OVER (PARTITION BY ID ORDER BY SEQ DESC) ranks
from t
) WHERE ranks = 1
示例演示
SELECT ID, BALANCE, SEQ FROM (
SELECT ID, BALANCE, SEQ, RANK() OVER (PARTITION BY ID ORDER BY SEQ DESC) ranks
FROM (
SELECT 1 ID, 102 BALANCE, 13 SEQ FROM dual UNION all
SELECT 1, 119, 15 FROM dual UNION all
SELECT 2, 50, 4 FROM dual UNION all
SELECT 3, 20, 11 FROM dual UNION all
SELECT 3, 15, 10 FROM dual UNION all
SELECT 3, 45, 9 FROM dual UNION all
SELECT 4, 90, 5 FROM dual UNION all
SELECT 5, 67, 20 FROM dual UNION all
SELECT 5, 12, 19 FROM dual UNION all
SELECT 6, 20, 1 FROM dual
)
) WHERE ranks = 1
您可以将其添加到您的大查询中,如下所示
SELECT ID, BALANCE, SEQ FROM (
select
ID, BALANCE, SEQ, RANK() OVER (PARTITION BY ID ORDER BY SEQ DESC) ranks
from (**YOUR BIG QUERY HERE**)
) WHERE ranks = 1
【讨论】:
以上是关于GROUP BY ID 并选择 MAX的主要内容,如果未能解决你的问题,请参考以下文章
LINQ:从列表中选择项目(Group By/Select/Sum & Max!)
Laravel:如何使用 group By 和 sum 并选择多字段