Comenzaría construyendo una tabla de Números que contenga enteros secuenciales del 1 al millón más o menos. Son muy útiles una vez que aprendes a hacerlo.
Por ejemplo, aquí se explica cómo obtener el día 1 de cada mes en 2008:
select firstOfMonth = dateadd( month, n - 1, '1/1/2008')
from Numbers
where n <= 12;
Ahora, puede juntar eso usando APLICACIÓN EXTERNA para encontrar la transacción más reciente para cada fecha así:
with Dates as (
select firstOfMonth = dateadd( month, n - 1, '1/1/2008')
from Numbers
where n <= 12
)
select d.firstOfMonth, t.TransactionValue
from Dates d
outer apply (
select top 1 TransactionValue
from Transactions
where TransactionDate <= d.firstOfMonth
order by TransactionDate desc
) t;
Esto debería darle lo que está buscando, pero es posible que tenga que buscar un poco en Google para encontrar la mejor manera de crear la tabla de Números.