Иммеем произвольный набор данных следкющей структуры:
Date | Deal | Sum |
---|---|---|
12.12.2009 | 111111 | 12000 |
25.12.2009 | 111111 | 5000 |
12.12.2009 | 122222 | 10000 |
12.01.2010 | 111111 | -10100 |
20.11.2009 | 222221 | 25000 |
20.12.2009 | 222221 | 20000 |
31.12.2009 | 222221 | -10000 |
29.12.2009 | 122222 | -10000 |
27.11.2009 | 222221 | -30000 |
Date - Дата Customer - Номер клиента Deal - Номер кредита Currency - Валюта кредита Sum - сумма, вынесенная на просрочку ("+") или выплаченная ("-")
Нужно найти
- Общую (накопленную) сумму просроченного долга непогашенную (не выплаченную) к моменту расчета.
- Дату начала текущей (последней) просрочки. Под датой начала просрочки, в данной задаче понимается первая дата непрерывного периода, в котором общая сумма просроченного непогашенного долга > 0.Учесть, что периодов просрочек может быть несколько.
- Кол-во дней текущей просрочки.
Online DEMO:
Изначально стояла цель выполнить задания без использования временных таблиц и хранимых процедур.
Написать реализацию на PostgreSQL несколько сложнее чем на ORACLE. Чать синтаксического сахара нужно заменять окнами Но некоторые функции заменить сложно, например в БД Sybase SQL Anywhere, DB2, Redshift и Oracle можно использовать лексему "IGNORE NULLS".
ignore nulls
in Postgress:
https://dba.stackexchange.com/questions/224332/window-function-ignore-nulls-workaround-for-postgresql
keep
in Postgress:
https://stackoverflow.com/questions/29750563/convert-keep-dense-rank-from-oracle-query-into-postgres
Первая часть задания выполняется достаточно просто. Как выполнить остальные чатси запроса описано тут:
Другие ваианты решений на базе ORACLE:
Based on discussions: