移動平均を求めるOracleのSQL
時系列分析でよく使う移動平均について。
AVGの集計関数にOVER以下の分析関数コマンドを追加して求めます。
3日の移動平均の関数だとこちら。2日前のデータまで取ってきて平均値を求めています。
AVG(数量) OVER(ORDER BY 日付 RANGE INTERVAL '2' DAY PRECEDING)
ROW#の移動平均を求めるSQLはこのようになります。
SELECT
ROW_NUMBER AS ROW#
,ROW_DAY AS DAY
,AVG(ROW_NUMBER) OVER(ORDER BY ROW_DAY RANGE INTERVAL '2' DAY Preceding) AS "移動平均"
FROM
(
SELECT
ROWNUM AS ROW_NUMBER
,SYSDATE + ROWNUM AS ROW_DAY
FROM ALL_CATALOG WHERE ROWNUM <= 10
)
ORDER BY ROW_DAY DESC
上のSQLの実行結果。月単位のデータでしたら、DAYをMONTHに変えれば月の移動平均になります。
ROW# DAY 移動平均
10 2018-10-15 9
9 2018-10-14 8
8 2018-10-13 7
7 2018-10-12 6
6 2018-10-11 5
5 2018-10-10 4
4 2018-10-09 3
3 2018-10-08 2
2 2018-10-07 1.5
1 2018-10-06 1