Sql Oracle从表中选择并联接日期最早的位置
我现实生活中的问题更多的是comlpex,但问题可以归结为以下几点:我有一张客户表,另一张是客户银行账户表。现在我想做一个选择,返回所有拥有银行账户的客户,加入最近使用最少的银行账户,由银行ID订购Sql Oracle从表中选择并联接日期最早的位置,sql,oracle,oracle11g,greatest-n-per-group,Sql,Oracle,Oracle11g,Greatest N Per Group,我现实生活中的问题更多的是comlpex,但问题可以归结为以下几点:我有一张客户表,另一张是客户银行账户表。现在我想做一个选择,返回所有拥有银行账户的客户,加入最近使用最少的银行账户,由银行ID订购 CLIENT: CLIENT_ID NAME ----------------- 1 JOE 2 BEN 3 SUE BANK_ACCOUNT: BANK_ID CLIENT_ID LAST_USED -----
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。本应该先去,因为他的“最老”银行账户在银行ID 1,而乔的在银行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
这样做的好处是,只需扩展
select
子句,您就可以轻松地从银行账户表中引入更多列(例如,您想要上次使用的日期)。一种典型的方法是使用行数()
在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;
用你正在使用的数据库标记你的问题。你是对的。恐怕我们还在11g上,等待19c的更新。很有趣!交叉应用似乎大于等于Oracle 12。我们的生产环境仍在11g上,等待19c的更新。同时,也许有一个连接表达式可以得到相同的结果,我可以研究一下这个表达式。很抱歉没有使用Oracle版本进行标记。谢谢。row_number()变量实现了这一点。还没有尝试聚合。
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;