Vous pouvez utiliser la fonction ROW_NUMBER() ici :
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
C'est juste la date de paiement la plus récente pour chaque mois, si vous le vouliez par LoanID, vous ajouteriez LoanID à la PARTITION BY
liste. Si vous souhaitez préserver les liens, vous pouvez utiliser RANK()
au lieu de ROW_NUMBER()