Możesz użyć funkcji ROW_NUMBER() tutaj:
SELECT *
FROM (SELECT lp.ID, lp.LoanID, lp.PaymentDate
, ROW_NUMBER() OVER (PARTITION BY YEAR(PaymentDate), Month(PaymentDate) ORDER BY PaymentDate DESC) 'RowRank'
FROM LoanPayments lp
)sub
WHERE RowRank = 1
To tylko najnowsza data płatności dla każdego miesiąca, jeśli chcesz, aby była to LoanID, dodaj LoanID do PARTITION BY
lista. Jeśli interesuje Cię zachowanie więzi, możesz użyć RANK()
zamiast ROW_NUMBER()