2013-09-22 28 views
7

私たちは時系列値を追加したMySQLデータベースを持っています。MySQLの時系列データ:サンプリング

------------------------------------- 
|Col A | Col B | Timestamp   | 
------------------------------------- 
|1.23 | 4.48 |2013-09-03 10:45:27 | 
------------------------------------- 
|1.23 | 4.48 |2013-09-03 10:46:27 | 
------------------------------------- 
|1.23 | 4.48 |2013-09-03 10:47:27 | 
------------------------------------- 

データが不均一w.r.t時間間隔を置いて配置され、いくつかの点は、数秒分&一部によって分離されています。

n分/秒/時間ごとにデータをプルするためにこのデータベースにクエリを行う効率的な方法はありますか?理想的には、n分の(直線的な)補間値が必要ですが、n分の最後の点、またはちょうどn番目の点の直前の最後の点もそうです。

ユースケースはグラフにプロットしたいが、必要以上に多くの点を必要としない。だから、1年間のプロットのためには、1日に数ポイントしか照会しない方がよいでしょう。 1日のプロット中は、1分ごとにポイントをプロットしたいと思います。

私はこれをすべてPHPで行うことができますが、データベースに直接入れることはできますか?もしそうでなければ、私は時系列データベースの使用を検討していますが、予算上の制約により、私は自由なものだけに制限されます。箱からのサンプリング、好ましくは補間を行う自由時間系列データベースはありますか?

+0

が重複する可能性を[ SQLのtimeseriesをサンプリングする](http://stackoverflow.com/questions/7335627/sampling-sql-timeseries) – Domi

答えて

0

私はこれに刺し傷がありました。本当に他の人がそれを解決する方法を知りたいと思っています。

これまでと同じような問題がありましたが、タイムインデックステーブルを作成し、時間枠に合わせて時間を書き直してデータテーブルを結合することで解決しました。問題は、新しい時間インデックステーブルが必要であり、時間間隔ごとに個別のクエリまたはビューが必要なことです。

このようにデータを結合することの利点は、読書や結果がなかった時間枠にも興味があったため、特定の時間枠ではヌルまたは読み取り値を確認する必要がありました。そのための最後のデータでは少し余分な作業が必要です(つまり、プレースホルダを取り出す)。

私がした最初のものは、時間インデックステーブルを作成し、それは次のようになります....

mysql> select * from ctb_time_idx WHERE YEAR(ctb_datetime) = 2013 LIMIT 10 ; 
+---------------------+ 
| ctb_datetime  | 
+---------------------+ 
| 2013-01-01 00:00:00 | 
| 2013-01-01 00:15:00 | 
| 2013-01-01 00:30:00 | 
| 2013-01-01 00:45:00 | 
| 2013-01-01 01:00:00 | 
| 2013-01-01 01:15:00 | 
| 2013-01-01 01:30:00 | 
| 2013-01-01 01:45:00 | 
| 2013-01-01 02:00:00 | 
| 2013-01-01 02:15:00 | 
+---------------------+ 
10 rows in set (0.07 sec) 

私はその後、労働組合

(select 
    ctb_datetime AS time1 , 
    'Placeholder' AS TimeInterval , 
    NULL AS `Col A` , 
    NULL AS `Col B` 
from my_time_idx 
    where YEAR (ctb_time_idx.ctb_datetime ) = 2013) 
UNION 
(select DATE_FORMAT(time1 , '%Y-%m-%d %H:00') AS time1 , 
    '00min' AS TimeInterval , `Col A` , `Col B` from my_data_table 
    where MINUTE(time1) BETWEEN 00 AND 14 ) 
UNION 
(select DATE_FORMAT(time1 , '%Y-%m-%d %H:15') AS time1 , 
    '15min' AS TimeInterval, `Col A` , `Col B` from my_data_table 
    where MINUTE(time1) BETWEEN 15 AND 29 ) 
UNION 
(select DATE_FORMAT(time1 , '%Y-%m-%d %H:30') AS time1 , 
    '30min' AS TimeInterval, `Col A` , `Col B` from my_data_table 
    where MINUTE(time1) BETWEEN 30 AND 44 ) 
UNION 
(select DATE_FORMAT(time1 , '%Y-%m-%d %H:45') AS time1 , 
    '45min' AS TimeInterval, `Col A` , `Col B` from my_data_table 
    where MINUTE(time1) BETWEEN 45 AND 59 )  
order by time1 

の私のデータは、私はこれを上のテスト私の古いテーブルとそれは正常に動作するようだ、私はあなたの例に合うように私のコードを編集する必要があったので、うまくいけば、それを行うときにそれを台無しにしていない。

+0

タイムスタンプ列にフルテキストインデックスを追加しない限り、これは極端に遅くなると思います。 – Domi

-1
select unix_timestamp(now()); 
select from_unixtime(unix_timestamp(now())); 
select from_unixtime(unix_timestamp(now())-unix_timestamp(now())%300); 
select from_unixtime(unix_timestamp(now())-unix_timestamp(now())%900); 
select from_unixtime(unix_timestamp(now())-unix_timestamp(now())%1800); 

+-----------------------+ 
| unix_timestamp(now()) | 
+-----------------------+ 
|   1383077951 | 
+-----------------------+ 
1 row in set (0.00 sec) 

+--------------------------------------+ 
| from_unixtime(unix_timestamp(now())) | 
+--------------------------------------+ 
| 2013-10-29 20:19:11     | 
+--------------------------------------+ 
1 row in set (0.00 sec) 

+----------------------------------------------------------------+ 
| from_unixtime(unix_timestamp(now())-unix_timestamp(now())%300) | 
+----------------------------------------------------------------+ 
| 2013-10-29 20:15:00           | 
+----------------------------------------------------------------+ 
1 row in set (0.00 sec) 

+----------------------------------------------------------------+ 
| from_unixtime(unix_timestamp(now())-unix_timestamp(now())%900) | 
+----------------------------------------------------------------+ 
| 2013-10-29 20:15:00           | 
+----------------------------------------------------------------+ 
1 row in set (0.00 sec) 

+-----------------------------------------------------------------+ 
| from_unixtime(unix_timestamp(now())-unix_timestamp(now())%1800) | 
+-----------------------------------------------------------------+ 
| 2013-10-29 20:00:00            | 
+-----------------------------------------------------------------+ 
1 row in set (0.00 sec) 
+1

ようこそ。コードのほかに、あなたの答えに説明を加えることを検討してください。 OPを説明すると、これは有用であり、何が欠けているのか、それが有用で役立つ答えである理由を人々が理解するのを助けるものである。 「良い答えを書くにはどうすればいいですか?」(http://stackoverflow.com/help/how-to-answer)を参照してください。 – dic19

0
私はそれを自分自身を使用しますが、最近、あなたの基準を満たすことができ、それのように聞こえる InfluxDBに出くわしていませんでした

- オープンソース時系列aggregation queriesを内蔵したデータベース - 例の

SELECT MEAN(column_name) FROM series_name group by time(10m) 
関連する問題