MySQL で SQL クエリを使用して 200 行の指数移動平均 (EMA) を計算しようとしています。各行は、前の行の値に依存しています。式は次のとおりです。
EMA = ((price - EMA(previous_average)) * (2 / (200 + 1))) + EMA(previous_average)
私のテーブルは最初は次のようになります
id price average
---------------------------
1 29.05 29.05000000
2 29.04 0.00000000
3 29.06 0.00000000
4 29.05 0.00000000
(最初の行の「平均」を「価格」に手動で設定したため、以下のクエリには初期値があります)
このクエリの実行
UPDATE
quotes
INNER JOIN
quotes AS quotes_previous ON quotes_previous.id = table.id - 1
SET
table.average = ((quotes.price - quotes_previous.average) * (2 / (200 + 1)) + quotes_previous.average)
where
quotes.id > 1
私のテーブルは次のようになります
id price average
---------------------------
1 29.05 29.05000000
2 29.04 29.04990050
3 29.06 1.13937059
3 29.05 1.13927205
ご覧のとおり、最初の 2 行を除くすべての行で平均が明らかに正しくありません。
問題は、クエリが ID 順に行を更新する必要があることだと思います。しかし、クエリに「ORDER BY id」を追加すると、「エラー 1221 (HY000): UPDATE と ORDER BY の使用方法が正しくありません」というメッセージが表示されます。UPDATE クエリで ORDER BY を JOIN と共に使用することはできないと思います。
では、前の行の値に依存する UPDATE クエリを実行するにはどうすればよいでしょうか?