我有一个名为loanRepaid的表,如下所示,我需要按如下所述编写查询。
loanid repaidday dueday settleday payratio
301 2018-09-23 2019-02-10 14 0.0
302 2018-02-12 2018-02-24 88 0.0
303 2018-02-12 2018-02-12 -20 0.0
301 2018-02-12 2018-02-12 7 0.0
306 2018-02-12 2018-02-12 -2 1.1
我需要隔离每笔贷款的第一笔付款。并且我需要使用 loanId , min 函数和分组依据来实现。所有的第一笔付款都应存储在一个临时表中。
注意第一笔付款是与贷款附有最早到期日的付款。
然后。我需要将创建的临时表与上述的loanRepaid表连接起来。我可以通过将借贷项上的两个表连接在一起,并在其到期日与相应借贷项的最小到期日相匹配的方式来做到这一点。
我还需要选择与每笔贷款的第一笔付款相关的所有变量,为每笔贷款创建一个名为 paydefault 的新变量,如果与第一笔付款相关的结算日为(1)大于7或为null,否则保持(0)。也就是说,首付款是在到期日后7天还是根本没有付款。
这是我写的一个查询,但我目前陷入困境,不知道从这里去哪里。
with firstPay as ( select loanId, min(dueday) as dueday
from loansRepaid
group by loanId
)
select * from firstPay as FP
join loansRepaid as Lp
on FP.loanId = Lp.loanId
and FP.dueDate = LP.dueDate
我也收到错误-结果中不支持重复的列名。
答案 0 :(得分:1)
限定所有列引用的数量,您将把这些问题最小化。
with firstPay as (
select lr.loanId, min(lr.dueday) as dueday
from loansRepaid lr
group by lr.loanId
)
select lp.*
from firstPay fp join
loansRepaid lr
on fp.loanId = lr.loanId and
fp.dueDate = lr.dueDate;
在这种情况下,解决方案是只需要外部查询中来自lp
的行。 fp
中的列只是复制这些列。
您可能会发现使用相关子查询的性能更好:
select lr.*
from loansrepaid lr
where lr.dueday = (select min(lr2.dueday)
from loansrepaid lr2
where lr2.loanid = lr.loanid
);
尤其是,这可以利用loansrepaid(loanid, dueday)
上的索引。
答案 1 :(得分:0)
为dudayday使用别名,loanId,因为两个表都存在 或只在列名之前使用tbale前缀,例如table.column
with firstPay as
( select loanId, min(dueday) as dueday
from loansRepaid
group by loanId
)
select FP.dueday as fpdueday,FP.loanId as loinidfp from firstPay as FP
join loansRepaid as Lp
on FP.loanId = Lp.loanId
and FP.dueDate = LP.dueDate
在您的版本中是8.0,然后是row_number()
select a.* from
(select l.*,row_number()over(partition by loanId order by dueday) rn
from loansRepaid l
) a where a.rn=1
答案 2 :(得分:0)
使用相关子查询
select * from tablename a
where dueday in (select min(dueday) from tablename b where a.loanid=b.loanid)