【问题标题】:SQL Duplicate column names not supportedSQL 不支持重复的列名
【发布时间】:2019-03-15 11:10:53
【问题描述】:

我有一个名为loansRepaid 的表,如下所示,我需要编写如下所述的查询。

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

我需要隔离每笔贷款的第一笔付款。我需要使用 loanIdmin 函数和 group by 来做到这一点。所有的第一笔付款都应该存储在一个临时表中。

注意第一笔付款是与贷款相关的最早到期日的付款。

那么。我需要将创建的临时表与上述的 loanRepaid 表连接起来。我可以通过加入两个表来做到这一点,这两个表的付款日期与相应的贷款ID 的最短截止日期相匹配。

我还需要选择与每笔贷款的第一笔付款相关的所有变量,为每笔贷款创建一个名为 paydefault 的新变量,如果结算日与第一笔付款相关,则该变量持有 (1)大于 7 或为空,否则保持 (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

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

【问题讨论】:

    标签: mysql sql


    【解决方案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) 上的索引。

    【讨论】:

    • 只是为了澄清。在临时表中,您使用别名 lr 作为还贷表,并在子查询中使用别名 lp 作为还贷表?
    • @wyn 。 . .别名无关紧要。 lrloansrepaid 更有意义。
    【解决方案2】:

    使用相关子查询

    select * from tablename a 
    where dueday in (select min(dueday) from tablename b where a.loanid=b.loanid)
    

    【讨论】:

      【解决方案3】:

      为dueday ,loanId 使用别名,因为两个表中都存在这两个列 或者只是在 table.column 之类的列名之前使用 tbale 前缀

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-21
        • 2017-09-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多