如何在层次结构中使用 oracle 查询获得此结果
Posted
技术标签:
【中文标题】如何在层次结构中使用 oracle 查询获得此结果【英文标题】:how to get this result using oracle query in hierarchical structure 【发布时间】:2014-07-19 22:34:02 【问题描述】:首先,使用一个抵押品,您可以多次从银行借钱。这意味着一个抵押品_num有许多贷款_num。
其次,您可以为一笔贷款提供多种抵押品。意思是一个loan_num有多个condentral_num。
有一个像这样的表,名为 LOAN。
抵押品编号 |贷款号码 ------------------------- C1 | A5 C2 | A5 C2 | A1 C3 | A1 C3 | A3 C6 | A7 C7 | A7我想从 LOAN 中获得最小的抵押品数量,如下表所示。 我将解释最小clooateral_num。 第一个表中有两组。其中一个是从第一排到第五排。然后,我们可以在第一组中找到一些类似C1→a5→c2→a1→c3→a3的关系。 我们丢弃包括'a'的节点。 结果 c1 将是 c1 c2 c3 中的最小 collatral num。(因为 c1 的数量最少。)
在第二组(c6→a7→c7)中,最低抵押品数量为 c6。
抵押品编号 | minimum_collateral_num |贷款号码 -------------------------------------------------- C1 | C1 | A5 C2 | C1 | A5 C2 | C1 | A1 C3 | C1 | A1 C3 | C1 | A3 C6 | C6 | A7 C7 | C6 | A7如何进行 SQL 查询以生成我所说的结果。任何评论都会对我有所帮助。谢谢。
【问题讨论】:
听起来像是我宁愿实现编码,而不是 SQL 查询。 【参考方案1】:我想我已经设法用分析函数做到了这一点(不是很优雅,但仍然如此)-
with
grps as(
select marker
from(
select collateral_num,
loan_num,
rownum as marker,
case when lead(loan_num,1) over (order by collateral_num) <> loan_num
and lead(collateral_num,1) over (order by collateral_num) <> collateral_num
then 1
when lead(loan_num,1) over (order by collateral_num) is null
then 1
else null end as grp
from loan
order by collateral_num
)
where grp is not null
)
, marked as(
select loan.*, grps.*, row_number() over(partition by marker order by collateral_num) as splitter
from loan, grps
)
select collateral_num,
min(collateral_num) over (partition by marker) as min_collateral_num,
loan_num
from marked y
where splitter <= marker
and (splitter > (select max(x.marker) from marked x where x.marker < y.marker)
or marker = (select min(marker) from marked))
请参阅http://sqlfiddle.com/#!4/cfb1a7/40/0 上的 sqlfiddle
【讨论】:
以上是关于如何在层次结构中使用 oracle 查询获得此结果的主要内容,如果未能解决你的问题,请参考以下文章
oracle ebs r12报告的Oracle flex值层次结构SQL查询