@www0rm

Как вывести все client_id, которые за весь срок кредита не совершали просрочек?

Есть таблица клиентов clients, в которой указан обязательный фиксированный ежемесячный платеж, который клиент должен платить по ипотеке.
Пример данных:

client_id payment_need
1 20000
2 25000
3 50000
… …

И есть таблица principals, в которой для каждого клиента на каждый месяц указана сумма основного долга. Долг не всегда уменьшается на сумму ежемесячного платежа, так как некоторые клиенты могут платить либо больше, либо меньше, либо вообще пропустить ежемесячный платеж.
Пример данных:

client_id report_date principal
1 01.01.2019 2 000 000
1 01.02.2019 1 980 000
1 01.03.2019 1 960 000
… … …
2 01.01.2019 2 000 000
2 01.02.2019 1 990 000
2 01.03.2019 1 500 000
… … …
3 01.10.2019 5 000 000
3 01.11.2019 5 000 000
3 01.12.2019 4 950 000
… … …
  • Вопрос задан
  • 102 просмотра
Пригласить эксперта
Ответы на вопрос 1
Я бы попробовал как-нибудь вот так:
select *
  from clients c
 where exists (
 select null
          from (select abs(principal - lag(principal) over(partition by client_id order by report_date)) diff 
                  from principals p
                 where p.client_id = c.client_id
                 )
         where diff < c.payment_need
            and diff is not null)

Ключевое в этом запросе lag и exists. Exists должен искать до первого найденного несоответствия, что в среднем ускоряет выборку, а lag -значение по прошлому месяцу.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы