Oracle select 来自 table 并加入最早的日期

Oracle select from table and join where date is oldest

我现实生活中的问题比较复杂,但问题可以归结为以下几点:我有一个 table 与客户有关,另一个 table 与客户的银行帐户有关。现在我想做一个 select 返回所有拥有银行账户的客户,加入最近最少使用的银行账户,按 BANK_ID.

排序
CLIENT:
CLIENT_ID    NAME
-----------------
1            JOE
2            BEN
3            SUE


BANK_ACCOUNT:
BANK_ID    CLIENT_ID    LAST_USED
-----------------------------------
1          2            Jan 1  2020
2          1            Mar 15 2020
3          2            Aug 5  2020
4          1            Feb 7  2020
5          1            Oct 13 2020

所以乔有三个银行账户,本有两个,苏没有。 select 应该只包含 Joe 和 Ben。 Ben 应该先走,因为他“最老的”银行账户在 BANK_ID 1 而 Joe 的在 BANK_ID 4.

BANK_ID   CLIENT_ID    NAME
---------------------------
1         2            BEN
4         1            JOE

我一直在尝试连接和子查询,但我不确定完成此查询的最佳方式是什么。

谢谢

一个选项使用横向连接:

select ba.bank_id, ba.client_id, c.name
from client c
cross apply (
    select ba.*
    from bank_account ba
    where ba.client_id = c.client_id
    order by ba.last_used
    fetch first row only
) ba

优点是您可以轻松地从银行帐户表中获取更多列(例如,假设您想要 last_used 日期),只需扩展 select 子句即可。

一个典型的方法是使用row_number():

select ba.bank_id, ba.client_id, c.name
from client c join
     (select ba.*,
             row_number() over (partition by client_id order by last_used) as seqnum
      from bank_account ba
     ) ba
     on ba.client_id = c.client_id and ba.seqnum = 1
order by ba.bank_id;

在Oracle中,也可以使用聚合:

select max(ba.bank_id) keep (dense_rank over order by ba.last_used) as bank_id,
       ba.client_id, c.name
from bank_account ba
     on ba.client_id = c.client_id 
group by ba.client_id, c.name
order by ba.bank_id;