Sql 如何在层次结构中使用oracle查询获得此结果
首先,有了一个抵押品,你就可以从银行借很多次钱。这意味着一个抵押品有很多贷款 第二,你可以为一笔贷款提供许多抵押品。这意味着一笔贷款有许多抵押品 有一个类似这样的表,名为LOAN collateral_num | loan_num ------------------------- C1 | A5 C2 | A5 C2 | A1 C3 | A1 C3 | A3 C6 | A7 C7 | A7 我想从贷款中获得最低担保金额,如下表所示。 我会向你解释你的秘密。 第一张表中有两组。其中一个是从第一排到第五排。然后,我们可以找到像C1这样的关系→a5→c2→a1→c3→第一组为a3。 我们丢弃了包含“a”的节点。 因此,c1将是c1中的最小项圈数。因为c1的项圈数最少 第二组为c6→a7→C7最小项圈数为c6 collateral_num | minimum_collateral_num | loan_num -------------------------------------------------- C1 | C1 | A5 C2 | C1 | A5 C2 | C1 | A1 C3 | C1 | A1 C3 | C1 | A3 C6 | C6 | A7 C7 | C6 | A7Sql 如何在层次结构中使用oracle查询获得此结果,sql,database,oracle,Sql,Database,Oracle,首先,有了一个抵押品,你就可以从银行借很多次钱。这意味着一个抵押品有很多贷款 第二,你可以为一笔贷款提供许多抵押品。这意味着一笔贷款有许多抵押品 有一个类似这样的表,名为LOAN collateral_num | loan_num ------------------------- C1 | A5 C2 | A5 C2 | A1 C3 | A1 C3 | A3 C6
如何进行SQL查询以生成我所告诉的结果。任何评论都会对我有帮助。谢谢。我想我已经成功地用分析函数实现了这一点,虽然不是很优雅,但无论如何-
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))
请参见位于的sqlfiddle,我想我已经成功地用分析函数实现了这一点,虽然不是很优雅,但仍然如此-
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))
请参见位于的sqlfiddle,我想我已经成功地用分析函数实现了这一点,虽然不是很优雅,但仍然如此-
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))
请参见位于的sqlfiddle,我想我已经成功地用分析函数实现了这一点,虽然不是很优雅,但仍然如此-
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))
请参见中的sqlfiddle,听起来我更愿意实现编码,而不是SQL查询。听起来我更愿意实现编码,而不是SQL查询。听起来我更愿意实现编码,而不是SQL查询。听起来我更愿意实现编码,而不是SQL查询。