次のスキーマを持つ単一テーブルの金融取引の MySQL データベースがあります。
+-----------------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------------------+------+-----+---------+-------+
| symbol_id | tinyint(3) unsigned | YES | MUL | NULL | |
| timestamp | timestamp(6) | YES | MUL | NULL | |
| buy_sell | char(1) | YES | | NULL | |
| price | decimal(10,6) | YES | MUL | NULL | |
+-----------------+---------------------+------+-----+---------+-------+
200 個の一意symbol_id
の があります。最終的には、これらすべてのペアの価格の実行中の (経時的な) 共分散を計算できるようにしたいと考えています。最初は、単一のペアの共分散を計算するだけで解決でき、その後反復できます。
共分散を計算するには、同じ長さの 2 つの配列が必要です (この場合はprice
)。これを単一のクエリとして記述する方法に苦労しており、ローカルで共分散を計算するためにすべてのレコードが返されるのを避けています。
2 つの疑似SQL クエリで達成しようとしているのは次のとおりです。
SELECT
(AVG(price1*price2) - AVG(price1)*AVG(price2)) as covar
FROM data
と
SELECT price AS price1 WHERE HOUR(timestamp)=1 AND symbol_id=1 LIMIT(MIN(COUNT(price1,price2)))
SELECT price AS price2 WHERE HOUR(timestamp)=1 AND symbol_id=2 LIMIT(MIN(COUNT(price1,price2)))
最初のステートメントはprice1
、 andの 2 つの等しい長さの配列を取りprice2
、共分散を計算します。2 番目のステートメントは、2 つの異なるタイプを選択するもので、すべてトランザクションの最初の 1 時間以内に発生し、返される値が同じ長さに制限されます。
私の限られた SQL の知識では、これらのクエリをどのように組み合わせるかを理解するのに苦労しています。どんな助けでも大歓迎です。最終的に、特定の時間ブロックのペアごとの共分散を計算する 1 つのクエリを実行できると便利です。