Если всегда будет строка, то кажется, что проще всего было бы с функцией windows AVG
. Используя значения конечного сэмпла, у вас есть:
SELECT V.AccountID,
V.SPID,
V.BilledDAte,
V.Amount,
AVG(V.Amount) OVER (PARTITION BY V.AccountID ORDER BY V.BilledDate
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS Last3Average
FROM (VALUES('xxx930','xxxxx1 ',CONVERT(date,'05/04/2019'),11.81),
('xxx930','xxxxx2 ',CONVERT(date,'07/05/2019'),11.01),
('xxx930','xxxxx3 ',CONVERT(date,'06/06/2019'),11.38),
('xxx930','xxxxx4 ',CONVERT(date,'04/07/2019'),11.01),
('xxx930','xxxxx5 ',CONVERT(date,'06/08/2019'),11.38),
('xxx930','xxxxx6 ',CONVERT(date,'06/09/2019'),11.38),
('xxx930','xxxxx7 ',CONVERT(date,'04/10/2019'),11.01),
('xxx930','xxxxx8 ',CONVERT(date,'06/11/2019'),11.38),
('xxx930','xxxxx9 ',CONVERT(date,'04/12/2019'),11.01),
('xxx930','xxxxx10',CONVERT(date,'07/01/2020'),11.38))V(AccountID,SPID, BilledDate,Amount);