首页 > 解决方案 > 加入并选择具有最大值的列

问题描述

我正在处理 Oracle 中的两个表,TABLE_A 包含唯一 ID 和余额(数字)。TABLE_B 显示相同 ID 的特定交易并包含以下字段:ID(非唯一)、BAL、Sequence_number。我想检查 TABLE_A.Balance 是否始终等于具有 Max(Sequence_number) 的 TABLE_B.Balance。所以我希望每个 ID 只有一行。

我尝试了以下方法,但它不会为每个 ID 返回唯一的行,而是返回多个。这是为什么?

Select a.ID, a.Balance,b.Balance, b.sequence_number From TABLE_A a Inner join (select ID, Balance, max(sequence_number) as sequence_number from TABLE_B group by ID, Balance) b On a.ID = B.ID Group by a.ID, a.Balance, b.Balance, b.sequence_number

表_A

ID_______Balance
1_______10
2_______15
3_______50

表_B

ID____Balance____Sequence_number
1_______19_______1
1_______75_______2
1_______10_______3
2_______39_______1
2_______15_______2
3_______120_______1
3_______89_______2
3_______57_______3
3_______50_______4

标签: sqloraclemaxinner-join

解决方案


您可以使用 row_number()over() 窗口函数来获取 ID 明智的最高序列号的行。

架构:

create table TABLE_A(ID int, Balance int);
insert into TABLE_A values(1,10);
insert into TABLE_A values(2,15);
insert into TABLE_A values(3,50);

create table TABLE_B (ID int , Balance int,Sequence_number int);
insert into TABLE_B values(1,19,1);
insert into TABLE_B values(1,75,2);
insert into TABLE_B values(1,10,3);
insert into TABLE_B values(2,39,1);
insert into TABLE_B values(2,15,2);
insert into TABLE_B values(3,120,1);
insert into TABLE_B values(3,89,2);
insert into TABLE_B values(3,57,3);
insert into TABLE_B values(3,50,4);
GO

询问:

    with cte as 
               (
               select id, balance, sequence_number, row_number()over (partition by id order by sequence_number desc)rnk from table_b
               )
    Select a.ID, a.Balance,b.Balance,  b.sequence_number From TABLE_A a  
    Inner join cte b on a.id=b.id and rnk=1;
GO

输出:

ID 平衡 平衡 序列号
1 10 10 3
2 15 15 2
3 50 50 4

db<>在这里摆弄


推荐阅读