Ответ 1
Функции окна в SQL 2008 довольно ограничены по сравнению с более поздними версиями, и если я правильно помню, вы можете только разделять, и вы не можете использовать ограничение на количество строк/диапазонов, но я думаю, что это может быть то, что вы хотите:
;WITH cte (rn, transactionid, value) AS (
SELECT
rn = ROW_NUMBER() OVER (ORDER BY transactionid),
transactionid,
value
FROM your_table
)
SELECT
transactionid,
value,
movagv = (
SELECT AVG(value)
FROM cte AS inner_ref
-- average is calculated for 250 previous to current row inclusive
-- I might have set the limit one row to large, maybe it should be 249
WHERE inner_ref.rn BETWEEN outer_ref.rn-250 AND outer_ref.rn
)
FROM cte AS outer_ref
Обратите внимание, что он применяет коррелированный подзапрос к каждой строке, и производительность может быть невелика.
В более поздних версиях вы могли использовать функции оконного кадра и сделали что-то вроде этого:
SELECT
transactionid,
value,
-- avg over the 250 rows counting from the previous row
AVG(value) OVER (ORDER BY transactionid
ROWS BETWEEN 251 PRECEDING AND 1 PRECEDING),
-- or 250 rows counting from current
AVG(value) OVER (ORDER BY transactionid
ROWS BETWEEN 250 PRECEDING AND CURRENT ROW)
FROM your_table