Нахождение минимального баланса с учетом временных рамок - PullRequest
2 голосов
/ 13 декабря 2010

Каков наилучший метод, с помощью которого я могу рассчитать минимальный баланс с учетом временных рамок?В моей базе данных есть столбец депозита, столбец снятия и столбец даты, в который они сделаны.

Обновление

Предположим, 1/ 1, баланс равен 300. На 1/2, 300 депонируется с общим количеством 600. На 1/15 200 снимается, оставляя остаток 400. На 1/25 производится дальнейшее снятие 300, и остаток идетдо 100. 1/28, 800 депонировано и итоговое сальдо до 900. Если бы 1/31 я вычислил минимальный остаток за этот месяц, я должен получить 100. Любые идеи?

Ответы [ 2 ]

2 голосов
/ 14 декабря 2010

Используйте функции управления окнами для построения текущего баланса, а затем извлекайте минимум из каждого временного интервала следующим образом:

<code>with cte_transaction_data as
(
    select 300 as deposit, null as withdraw, date '01/02/2010' as transaction_date union all
    select null, 200, date '01/15/2010' union all
    select null, 300, date '01/25/2010' union all
    select 800, null, date '01/28/2010'
)
select
    month,
    min(balance) as minimum_balance
from
    (
        select 
            transaction_date,
            date_trunc('month', transaction_date) as month,
            300 
            + coalesce(sum(deposit) over(order by transaction_date rows between unbounded preceding and current row), 0)
            - coalesce(sum(withdraw) over(order by transaction_date rows between unbounded preceding and current row), 0) as balance
         from cte_transaction_data
    ) as running_balance
group by
    month
order by
    month

Результат:

<code>month                   minimum_balance
2010-01-01 00:00:00-06  100
1 голос
/ 13 декабря 2010

Перебирайте каждую запись в базе данных за каждый день, когда произошел ввод / вывод, и сохраняйте наименьшее число в переменной.Если число проверяемого дня меньше, замените переменную на это число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...