Вы решаете вариант проблемы "промежуточных итогов". Что странно в вашем вопросе, так это отсутствие критерия упорядочения строк - в ваших данных должен быть какой-то идентификатор или обычно временная метка для указания порядка транзакций в логах c.
Вы можете решить проблему с помощью оконных функций, например:
with t (order_criterion, opening,issue) as (values
(1,1200,6),
(2,1200,10),
(3,1200,8),
(4,1200,9)
)
select opening - coalesce(sum(issue) over (order by order_criterion rows between unbounded preceding and 1 preceding), 0) as opening
, issue
, opening - sum(issue) over (order by order_criterion) as closing
from t
или
with t (order_criterion, opening,issue) as (values
(1,1200,6),
(2,1200,10),
(3,1200,8),
(4,1200,9)
), i as (
select order_criterion
, opening
, issue
, opening - sum(issue) over (order by order_criterion) as closing
from t
)
select coalesce(lag(closing) over (order by order_criterion), opening) as opening
, issue
, closing
from i
См. дБ: https://dbfiddle.uk/?rdbms=postgres_12&fiddle=53705b0d971deb9395df2091fba0857e