Zacząłbym od zbudowania tabeli Numbers zawierającej sekwencyjne liczby całkowite od 1 do około miliona. Przydają się, gdy już to zrozumiesz.
Na przykład, oto jak uzyskać pierwszy dzień każdego miesiąca w 2008 roku:
select firstOfMonth = dateadd( month, n - 1, '1/1/2008')
from Numbers
where n <= 12;
Teraz możesz to połączyć, korzystając z funkcji OUTER APPLY, aby znaleźć najnowszą transakcję dla każdej daty, w następujący sposób:
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;
To powinno dać ci to, czego szukasz, ale być może będziesz musiał trochę poszukać w Google, aby znaleźć najlepszy sposób na utworzenie tabeli liczb.