Я не думаю, что есть простое решение этой проблемы. Если вы хотите удалить все совпадающие пары, вы можете перечислить и удалить:
select min(invoice_id), min(created_at), user_id, max(amount_in_cents) as amount_in_cents
from (select t.*,
row_number() over (partition by user_id, amount_in_cents order by created_at) as seqnum
from t
) t
group by abs(amount_in_cents), user_id, seqnum
having count(*) = 1; -- only one "matching" amount
Однако ограничение в 30 дней является сложным, и я думаю, что вам может понадобиться рекурсивный CTE для это.
Рассмотрим следующие данные:
1 jan 1 500
1 jan 15 500
1 feb 1 -500
1 feb 10 -500
Какой результат вы бы хотели?