Можно вот так попробовать:
select d1.[time], d1.contr, d1.val
from debt d1
join debt d2
on d2.[time] <= d1.[time]
group by d1.contr, d1.val, d1.[time]
having sum(d2.val) <= 25 -- сумма которую нужно выплатить
order by d1.[time]
Тут debt - таблица с задолженностями.
Есть пара моментов при такой реализации:
1. Нужно быть уверенным, что все задолженности будут попадать в систему с разными датами-временем,
если например дата и время совпадут у двух, то как тут строить ФИФО вопрос.
2. Желательно как-то помечать задолженности которые оплачены, чтобы повторно их не отбирать.
3. Поле time лучше обозвать иначе, сейчас оно совпадает с системным типом данных для хранения времени.