2017-09-03 13 views
2

私は、次の形式でのデータから5分の価格の9長移動平均を取得しようとしている:のMySQL 5分

ID、価格、タイムライン

1 15.36573000 2017-08-31 22:00:00 
1 15.29229000 2017-08-31 21:55:00 
1 15.23297000 2017-08-31 21:50:00 
1 15.23469000 2017-08-31 21:45:00 
1 15.23234000 2017-08-31 21:40:00 
1 15.25399000 2017-08-31 21:35:00 
1 15.26228000 2017-08-31 21:30:00 
1 15.21136000 2017-08-31 21:25:00 
1 15.29847000 2017-08-31 21:20:00 
1 15.32074000 2017-08-31 21:15:00 
1 15.32239000 2017-08-31 21:10:00 
1 15.27938000 2017-08-31 21:05:00 
1 15.25282000 2017-08-31 21:00:00 

だから、9つの期間(45分)の平均値は次のようになります。

8/31/2017 21:45 through 8/31/2017 21:05 = 15.26840444 
8/31/2017 21:40 through 8/31/2017 21:00 = 15.27041889 
8/31/2017 21:35 through 8/31/2017 20:55 = 15.27291889 

私は一日でいくつかの移動平均を見たが、決定することができませんでしてきました最後の9つのタイムスタンプでグループ化する方法

答えて

0

MySQLでこれを処理する方法の1つは、相関サブクエリです。以下のクエリでは、以前のデータポイントの数をカウントせず、代わりに時間差(40分)に依存していることに注意してください。たぶんあなたのデータが常に同じ数のポイントを持つわけではないので、これはより意味をなさないようです。

SELECT 
    CONCAT(CAST(t1.timeline - INTERVAL 40 MINUTE AS CHAR(50)), ' through ', 
      CAST(t1.timeline AS CHAR(50))) AS window, 
    (SELECT AVG(t2.price) FROM yourTable t2 
    WHERE t2.timeline 
     BETWEEN t1.timeline - INTERVAL 40 MINUTE AND t1.timeline) AS avg_price 
FROM yourTable t1 
WHERE 
    t1.timeline >= (SELECT MIN(timeline) + INTERVAL 40 MINUTE FROM yourTable) 
ORDER BY t1.timeline 

ここにデモ:

Rextester

+0

美しく働きました。私は何らかの理由でビューに対してこれを行うことはできません(私のビューからテーブルにデータをコピーすると、それは動作します...ビューに対して実行されている同じクエリがクレイジーに行く) ...私は数日間この作業を続けてきましたが、それ以上の時間を無駄にしない理由を見つけようとはしませんでした。ありがとうございます –

+0

私はなぜ私のビューがうまくいかなかったのか理解しました。なぜなら、複数のIDを持っているからです。 –

+0

WHERE t2.symbol_id = t1.symbol_id AND t2.timeline BETWEEN .... –