Inizierei costruendo una tabella di numeri contenente numeri interi sequenziali da 1 a un milione circa. Sono davvero utili una volta che ci prendi la mano.
Ad esempio, ecco come ottenere il primo giorno di ogni mese nel 2008:
select firstOfMonth = dateadd( month, n - 1, '1/1/2008')
from Numbers
where n <= 12;
Ora puoi metterlo insieme usando OUTER APPLY per trovare la transazione più recente per ogni data in questo modo:
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;
Questo dovrebbe darti quello che stai cercando, ma potresti dover cercare un po' su Google per trovare il modo migliore per creare la tabella di Numbers.