2016-09-08 12 views
0

における間隔Iは、加速度計データを持つテーブル「cardoor」を持っている:0.4秒で平均値を計算する。 mysqlの

Time   | dx  | dy 
===================================== 
1464684066.38 | -2.090 | -0.570 
1464684066.45 | -2.150 | -0.670 
1464684066.48 | -2.090 | -0.650 

私は「タイムから0.4秒間隔を使用して「DX」と「DY」の平均値を取得しようとしています'列。

これまで私はこの間隔でデータを取得していましたが、それは私のためには機能しません。遅すぎます(2百万行のテーブルで30分待っていました)。

最後の0.4秒の平均値である2列avg(dx)とavg(dy)を追加する必要があります。

SELECT b.Time, AVG(dx), AVG(dy) 
FROM cardoor b LEFT JOIN cardoor p 
ON p.Time BETWEEN b.Time-0.4 AND b.Time 
GROUP BY b.Time 

より適切な場合は、MySQL以外の提案を検討してください。

+0

正確にどのタイプの平均値を取得しようとしていますか?クエリでは200万エントリの平均値が得られます(平均値は0.4秒以内です)。これは、2百万レコードと2百万レコードを比較する必要があることを意味します。 2百万レコードを0.4秒ブロックに分割し、その平均値を取って2百万レコードに満たないレコードに戻したい場合は、おそらく大幅にスピードを上げることができます。 – PaulF

+0

私は次のクエリを試しました:[コード] from_unixtime(ROUND(Time /(60 * 0.00666))* 60 * 0.00666)* 60 * 0.00666)を選択してください。rounded_time from auto.cardoor1 rounded_time [/ code] 1秒間の平均結果。 (したがって、1秒未満では動作しません)。そして、私は'20/01/2016 18:54:44 'のような形式になっていましたが、実際にはUnix形式が必要です。 –

+0

これは正しく動作しました:_SELECT round( 'time'/0.4)* 0.4 Time1 、AVG(dx)、AVG(dy)FROMタイムグループGROUP BY Time1;期待される結果数の平均。 – PaulF

答えて

-1

ローリング平均型の結果を必要としない場合、時間列に数式を適用すると、結合なしのクエリが可能になります。

は、これは正しく私のために働いていた:それは&はその後、時分割によるバックアップ掛け整数に丸める

SELECT round(`time`/0.4) * 0.4 Time1, AVG(dx), AVG(dy) 
FROM timegroup 
GROUP BY Time1; 

は、必要な時分割で時間を分割する - 同じ時間をブロックするその時間内のすべてのエントリを与えます。その後、Time1でグループ化するだけで&は他の2つの列を平均します。

+0

答えが受け入れられた後のすべての時間が終了しても投票結果が下がった理由は何ですか?問題を解決するにはより良い方法でしょうか? – PaulF