Това не ми е на главата и аз съм на път да изляза от вратата, така че не е проверено. Също така не мога да си представя, че ще се представи много добре на какъвто и да е голям набор от данни. Потвърдих, че поне работи без грешка. :)
SELECT
value_column1,
(
SELECT
AVG(value_column1) AS moving_average
FROM
Table1 T2
WHERE
(
SELECT
COUNT(*)
FROM
Table1 T3
WHERE
date_column1 BETWEEN T2.date_column1 AND T1.date_column1
) BETWEEN 1 AND 20
)
FROM
Table1 T1