1

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 クエリを実行するにはどうすればよいでしょうか?

4

1 に答える 1