Предполагая, что индекс является инкрементным, а более высокие значения -> более поздние даты транзакции, вы можете использовать самообъединение с условием> = в предложении соединения, что-то вроде этого:
select
a.[Index],
max(a.[Tenant]) as [Tenant],
max(a.[AmountCharged]) as [AmountCharged],
max(a.[AmountPaid]) as [AmountPaid],
sum(
iif(isnull(b.[AmountCharged]),0,b.[AmountCharged])+
iif(isnull(b.[AmountPaid]),0,b.[AmountPaid])
) as [Balance]
from
[Transactions] as a
left outer join
[Transactions] as b on
a.[Tenant] = b.[Tenant] and
a.[Index] >= b.[Index]
group by
a.[Index];
Доступ к SQL является неудобным; выше могут быть некоторые синтаксические ошибки, но это общая идея. Чтобы создать этот запрос в конструкторе запросов, дважды добавьте таблицу «Транзакции», объедините их в Tenant и Index, а затем измените объединение (если возможно).
Вы можете сделать то же самое с подзапросом, что-то вроде:
select
[Index],
[Tenant],
[AmountCharged],
[AmountPaid],
(
select
sum(
iif(isnull(b.[AmountCharged]),0,b.[AmountCharged])+
iif(isnull(b.[AmountPaid]),0,b.[AmountPaid])
)
from
[Transactions] as b
where
[Transactions].[Tenant] = b.[Tenant] and
[Transactions].[Index] >= b.[Index]
) as [Balance]
from
[Transactions];
После того, как вы вычислили правильные сальдо, используйте запрос на обновление, чтобы обновить таблицу, соединив таблицу транзакций с запросом выбора, определенным выше для индекса. Возможно, вы могли бы объединить его в один запрос на обновление, но это усложнило бы тестирование.