Вы можете сделать вычисление как совокупную сумму, деленную на совокупное количество, но вы должны вычесть текущее значение:
select t.*,
( (sum(diff) over (partition by id order by date_start) - diff) /
(count(*) over (partition by id order by date_start) - 1)
) as avg_through_previous
from t cross apply
(values (datediff(day, date_start, date_end)) v(diff);
На самом деле, вы также можете выразить это с помощью выражения окна:
select t.*,
avg(diff) over (partition by id
order by date_start
rows between unbounded preceding and 1 preceding
) as avg_through_previous
from t cross apply
(values (datediff(day, date_start, date_end)) v(diff);