Повторяющиеся имена столбцов SQL не поддерживаются - PullRequest
1 голос
/ 15 марта 2019

У меня есть таблица 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, или он равен нулю, иначе он удерживает (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 ]

1 голос
/ 15 марта 2019

Уточните все ссылки на столбцы, и вы минимизируете такие проблемы.

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).

0 голосов
/ 15 марта 2019

использовать коррелированный подзапрос

select * from tablename a 
where dueday in (select min(dueday) from tablename b where a.loanid=b.loanid)
0 голосов
/ 15 марта 2019

использовать псевдоним для dueday, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...