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;
我现实生活中的问题比较复杂,但问题可以归结为以下几点:我有一个 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;