Другой метод:
SELECT
T1.TransID,
T1.TenantID,
T1.TransactionType,
T1.Amount,
T1.TransactionDate,
T2.TransactionDate AS PreviousPaymentDate
FROM
Transactions T1
LEFT OUTER JOIN Transactions T2 ON
T2.TenantID = T1.TenantID AND
T2.TransactionType = 2 AND
T2.TransactionDate < T1.TransactionDate
LEFT OUTER JOIN Transactions T3 ON
T3.TenantID = T1.TenantID AND
T3.TransactionType = 2 AND
T3.TransactionDate < T1.TransactionDate AND
T3.TransactionDate > T2.TransactionDate
WHERE
T3.TransID IS NULL AND
<your normal selection criteria>
По сути, вы получаете последнюю транзакцию (T2), которая относится к типу 2 для того же арендатора, где после этой транзакции не появляется никакой другой транзакции для этого арендатора и того же типа 2 (это то, что делает T3.TransID IS NULL - единственный способ, которым это будет НЕДЕЙСТВИТЕЛЬНО, если не было найдено никакого соответствия). Вы также можете сделать это немного яснее с NOT EXISTS, но производительность часто лучше с двойным LEFT OUTER JOIN. Вот НЕ СУЩЕСТВУЮЩАЯ версия:
SELECT
T1.TransID,
T1.TenantID,
T1.TransactionType,
T1.Amount,
T1.TransactionDate,
T2.TransactionDate AS PreviousPaymentDate
FROM
Transactions T1
LEFT OUTER JOIN Transactions T2 ON
T2.TenantID = T1.TenantID AND
T2.TransactionType = 2 AND
T2.TransactionDate < T1.TransactionDate
WHERE
NOT EXISTS (
SELECT *
FROM Transactions T3
WHERE
T3.TenantID = T2.TenantID AND
T3.TransactionType = 2 AND
T3.TransactionDate < T1.TransactionDate AND
T3.TransactionDate > T1.TransactionDate
) AND
<your normal selection criteria>