Det här är precis utanför mitt huvud, och jag är på väg ut genom dörren, så det är oprövat. Jag kan inte heller föreställa mig att det skulle fungera särskilt bra på någon form av stor datamängd. Jag bekräftade dock att den åtminstone körs utan fel. :)
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