Вы можете использовать встроенную функцию агрегации / окна var()
, если ваше определение отклонения соответствует тому, что делает эта функция.
Если у вас есть один день на строку и вы готовы принять 90 дней как «3 месяца», то вы можете просто сделать:
select t.*, var(amount) over (order by date rows between 89 preceding and current row) as rolling_var
from t;
Если эти условия не выполняются, гораздо менее эффективный метод использует самосоединение:
select t.date, t.amount, var(t2.amount)
from t join
t t2
on t2.date > dateadd(month, -3, t.date) and t2.date <= t.date
group by t.date, t.amount;