具有多个条件的Oracle SQL联接子查询
编辑:在每个代码段下添加示例结果,并在末尾添加所需结果 我已经浏览了好几篇文章,但我似乎找不到一个我能准确应用的解决方案。我有一个表具有多个条件的Oracle SQL联接子查询,sql,oracle,Sql,Oracle,编辑:在每个代码段下添加示例结果,并在末尾添加所需结果 我已经浏览了好几篇文章,但我似乎找不到一个我能准确应用的解决方案。我有一个表r,其中包含acctnbr和modnbr的数据。对于大多数acctnbr只有一条记录,结果modnbr为1,但如果modnbr为1-5,则最多可以有5条记录 表u没有modnbr,所以我想在acctnbr上做一个左连接,只从表u返回表r中的maxmodnbr的值 这是我的代码,没有尝试加入。我需要在联接中包含其他限定符,如图所示: select r.acctnbr,
r
,其中包含acctnbr
和modnbr
的数据。对于大多数acctnbr
只有一条记录,结果modnbr
为1,但如果modnbr
为1-5,则最多可以有5条记录
表u
没有modnbr
,所以我想在acctnbr
上做一个左连接,只从表u
返回表r
中的maxmodnbr
的值
这是我的代码,没有尝试加入。我需要在联接中包含其他限定符,如图所示:
select
r.acctnbr,
r.modnbr,
r.modtypcd,
r.moddate,
u.userfieldcd,
u.value
from loanrestructuretracking r
LEFT JOIN acctuserfield u on u.acctnbr = r.acctnbr
and u.userfieldcd = 'LOMO'
order by r.moddate desc
正如所料,无论modnbr
如何,我都会为每个r.acctnbr
获得相同的u.value
。结果如下:
+---------+--------+----------+------------+-------------+-------+
| acctnbr | modnbr | modtypcd | moddate | userfieldcd | value |
+---------+--------+----------+------------+-------------+-------+
| 1122330 | 1 | LM | 1/1/2018 | LOMO | DLQ |
| 1223340 | 1 | LM | 2/5/2018 | LOMO | DLQ |
| 2233440 | 1 | LM | 6/9/2017 | LOMO | COT |
| 2233440 | 2 | LM | 11/20/2017 | LOMO | COT |
| 2233440 | 3 | LM | 3/12/2018 | LOMO | COT |
| 3344550 | 1 | LM | 4/27/2018 | LOMO | EXT |
| 3344550 | 2 | LM | 6/2/2018 | LOMO | EXT |
+---------+--------+----------+------------+-------------+-------+
现在,这里是我试图寻找maxmodnbr
的代码,但我现在只看到maxmodnbr
的任何实例的u.value
(在我的例子中,5)
下面是上述脚本的结果。请注意,对于具有maxmodnbr
的记录,只有一个u.value
:
+---------+--------+----------+------------+-------------+-------+
| acctnbr | modnbr | modtypcd | moddate | userfieldcd | value |
+---------+--------+----------+------------+-------------+-------+
| 1122330 | 1 | LM | 1/1/2018 | LOMO | |
| 1223340 | 1 | LM | 2/5/2018 | LOMO | |
| 2233440 | 1 | LM | 6/9/2017 | LOMO | |
| 2233440 | 2 | LM | 11/20/2017 | LOMO | |
| 2233440 | 3 | LM | 3/12/2018 | LOMO | COT |
| 3344550 | 1 | LM | 4/27/2018 | LOMO | |
| 3344550 | 2 | LM | 6/2/2018 | LOMO | |
+---------+--------+----------+------------+-------------+-------+
最后,这里是所需的结果-每个acctnbr
的maxmodnbr
的u值,以及该acctnbr
的非maxmodnbr
的任何记录的null值:
+---------+--------+----------+------------+-------------+-------+
| acctnbr | modnbr | modtypcd | moddate | userfieldcd | value |
+---------+--------+----------+------------+-------------+-------+
| 1122330 | 1 | LM | 1/1/2018 | LOMO | DLQ |
| 1223340 | 1 | LM | 2/5/2018 | LOMO | DLQ |
| 2233440 | 1 | LM | 6/9/2017 | LOMO | |
| 2233440 | 2 | LM | 11/20/2017 | LOMO | |
| 2233440 | 3 | LM | 3/12/2018 | LOMO | COT |
| 3344550 | 1 | LM | 4/27/2018 | LOMO | |
| 3344550 | 2 | LM | 6/2/2018 | LOMO | EXT |
+---------+--------+----------+------------+-------------+-------+
我需要做什么才能使连接在maxmodnbr
peracctnbr
上工作?
谢谢 我想你想要:
select . . .
from (select r.*, row_number() over (partition by r.acctnbr order by r.modnbr desc) as seqnum
from loanrestructuretracking r
) r left join
acctuserfield u
on u.acctnbr = r.acctnbr and
u.userfieldcd = 'LOMO'
where seqnum = 1
order by r.moddate desc;
我有:
with base_qry as
(
select
r.acctnbr,
r.modnbr,
r.modtypcd,
r.moddate,
u.userfieldcd,
u.value,
max(r.modnbr ) over (partition by r.acctnbr) as max_modnbr
from loanrestructuretracking r
LEFT JOIN acctuserfield u on u.acctnbr = r.acctnbr
and u.userfieldcd = 'LOMO'
)
select
acctnbr,
modnbr,
modtypcd,
moddate,
userfieldcd,
case when modnbr = max_modnbr then value else null end as value
from base_query
order by moddate desc
没有数据,所以不是100%确定,但我认为这会给你你想要的
max(r.modnbr)over(由r.acctnbr分割),因为max_modnbr将每个acctnbr的最大modnbr追加到每一行
然后,case语句将不匹配的行上的值替换为null
可以把整件事写得更简洁一些,如:
select
r.acctnbr,
r.modnbr,
r.modtypcd,
r.moddate,
u.userfieldcd,
case when modnbr = max(r.modnbr ) over (partition by r.acctnbr)
then u.value else null end as value
from loanrestructuretracking r
LEFT JOIN acctuserfield u on u.acctnbr = r.acctnbr
and u.userfieldcd = 'LOMO'
更新您的问题并添加适当的数据样本。。您的实际结果和预期结果使我无法将一些虚拟数据放在一起,因为我无法共享实际结果results@scaisEdge表LoanStructureTracking和表acctuserfield的更新一致数据也很有用。。如果没有起始数据,我无法理解你是如何得到结果的……如果我能提供更多数据,我会。。。。简而言之,LoanRestructure Tracking的主键是acctnbr和modnbr,而acctuserfield的主键只有acctnbr。Modnbr是顺序的-Modnbr=3比Modnbr=2更新,而acctuserfield中的值是最新Modnbr的值。我只想要每个acctnbr的最新modnbr的值。将最新modnbr的值分配给所有modnbr是不正确的。这在仅返回最大modnbr的记录时有效,但当modnbr不是每个acctnbr.Beautiful的最大值时,我会查找空值-它有效。感谢使用较小的版本进行更新,我的权限级别要求我使用SELECT启动每个查询,因此CTE是不可能的。很高兴提供帮助-分析功能非常有用。
select
r.acctnbr,
r.modnbr,
r.modtypcd,
r.moddate,
u.userfieldcd,
case when modnbr = max(r.modnbr ) over (partition by r.acctnbr)
then u.value else null end as value
from loanrestructuretracking r
LEFT JOIN acctuserfield u on u.acctnbr = r.acctnbr
and u.userfieldcd = 'LOMO'