Следующие данные представляют входящие и исходящие транзакции двух займов.Идентификатор транзакции (t_id) представляет порядок, в котором происходят события транзакции.
+---------+------+-----+--------+
| loan_id | t_id | amt | t_type |
+---------+------+-----+--------+
| 1 | 1 | 100 | OUT |
| 1 | 2 | 20 | IN |
| 1 | 3 | 30 | IN |
| 1 | 4 | 150 | OUT |
| 1 | 5 | 15 | IN |
| 1 | 6 | 25 | IN |
| 1 | 7 | 40 | OUT |
| 1 | 8 | 200 | IN |
| 2 | 1 | 150 | OUT |
| 2 | 2 | 50 | OUT |
| 2 | 3 | 120 | IN |
| 2 | 4 | 20 | OUT |
| 2 | 5 | 100 | IN |
+---------+------+-----+--------+
Цель - пропорционально распределить входящие суммы на исходящие суммы на основе суммы открытия исходящей транзакции во время события транзакции входящей суммы.Каждый заем должен обрабатываться отдельно.
Должна применяться следующая логика:
loan_id: 1
1) Входящие транзакции 2 и 3 должны быть на 100% распределены для исходящей транзакции 1, поскольку в данный момент это только исходящая транзакция.
2) Входящей транзакции 5 следует распределить 25% / 75% между исходящими транзакциями 1 и 4. (открытая сумма транзакции 1 равна 50, потому что 50 погашается транзакциями 2 и 3, а открытая сумма транзакции 4 равна 150)
3) Входящая транзакция 6 должна быть распределена на 25% / 75% между исходящими транзакциями 1 и 4. (открытая сумма транзакции 1 составляет 46,25, а открытая сумма транзакции 4 - 138,75)
4) Входящая транзакция 8 должна быть распределена на 20%60% / 20% между исходящими транзакциями 1;4 и 7. (транзакции 1; 4 и 7 открытых сумм: 40, 120 и 40)
Можно предположить, что общая входящая сумма и текущая общая входящая сумма всегда меньше или равна общей открытой исходящей сумме.
Вот так должен выглядеть итоговый результат:
+---------+---------+----------+---------------+
| loan_id | in_t_id | out_t_id | allocated_amt |
+---------+---------+----------+---------------+
| 1 | 2 | 1 | 20 |
| 1 | 3 | 1 | 30 |
| 1 | 5 | 1 | 3.75 |
| 1 | 5 | 4 | 11.25 |
| 1 | 6 | 1 | 6.25 |
| 1 | 6 | 4 | 18.75 |
| 1 | 8 | 1 | 40 |
| 1 | 8 | 4 | 120 |
| 1 | 8 | 7 | 40 |
| 2 | 3 | 1 | 90 |
| 2 | 3 | 2 | 30 |
| 2 | 5 | 1 | 60 |
| 2 | 5 | 2 | 20 |
| 2 | 5 | 4 | 20 |
+---------+---------+----------+---------------+
Ссылка на скрипту SQL: http://www.sqlfiddle.com/#!17/9eecb/16623
Все комбинации из 14 строк генерируются, но не размещаются по адресу__ *.
В настоящее время я не уверен, возможно ли создать SQL для генерации такой логики.
Я попытался реализовать это с помощью оконных функций, но безуспешно, потому что всегда нужнознать исходящие открытые суммы на основе предыдущего пропорционального распределения.
Может быть, возможно создать рекурсивный запрос, чтобы покрыть эту логику.