Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle从表中选择并联接日期最早的位置_Sql_Oracle_Oracle11g_Greatest N Per Group - Fatal编程技术网

Sql Oracle从表中选择并联接日期最早的位置

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 -----

我现实生活中的问题更多的是comlpex,但问题可以归结为以下几点:我有一张客户表,另一张是客户银行账户表。现在我想做一个选择,返回所有拥有银行账户的客户,加入最近使用最少的银行账户,由银行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。本应该先去,因为他的“最老”银行账户在银行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;