【问题标题】:Join and select column with max value加入并选择具有最大值的列
【发布时间】:2023-03-25 02:55:01
【问题描述】:

我正在处理 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

TABLE_A

ID_______Balance
1_______10
2_______15
3_______50

TABLE_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

【问题讨论】:

    标签: sql oracle max inner-join


    【解决方案1】:

    你可以使用窗口函数:

    select a.*, b.balance
    from a left join
         (select b.*,
                 row_number() over (partition by id order by sequence_number desc) as seqnum
          from b
         ) b
         on b.id = a.id and b.seqnum = 1;
    

    我不太确定您要比较什么,但这会返回a 中的每一行以及b 中具有最高序列号的行。

    【讨论】:

    • 我试过了,但它不会为每个 ID 以 max(sequence_number) 返回单行,而是为每个 ID 按 sequence_number 排序的多行...
    • @SalvatoreVitale 。 . .这将准确返回表A 中的行。如果你得到重复,那是因为A 有重复或者你没有运行这个查询。注意seqnum 不是sequence_number
    【解决方案2】:

    您可以使用 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 Balance Balance sequence_number
    1 10 10 3
    2 15 15 2
    3 50 50 4

    db小提琴here

    【讨论】:

    • 我已经修改了我的答案。请立即检查。
    猜你喜欢
    • 2015-01-14
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 2011-09-12
    • 2014-09-15
    • 2011-02-20
    相关资源
    最近更新 更多