不支持SQL重复列名

时间:2019-03-15 11:10:53

标签: mysql sql

我有一个名为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

我也收到错误-结果中不支持重复的列名。

3 个答案:

答案 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)