2013-09-22 50 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分鐘/秒/小時的數據提取數據?理想情況下,我希望第(th)分鐘處的(線性)內插值,但是最接近第012分鐘或最後一分鐘點或第012分鐘處的最後一點也可以。

用例是我想繪製成一個圖形,但不要太多點超過必要。因此,爲了繪製一年,我寧願每天只查詢幾個點。在繪製一天的同時,我想每分鐘左右繪製一個點。

我可以在PHP中完成所有這些工作,但有沒有辦法直接在數據庫中執行此操作?如果沒有,我正在考慮使用時間序列數據庫,但預算約束限制我只有自由的。是否有任何免費的時間序列數據庫,可以提供開箱即用的採樣和插值?

+0

可能重複[取樣SQL時間序列](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

歡迎來到SO。除了代碼,請考慮在你的答案中添加一個解釋。解釋OP在哪些方面是有用的,他/她缺少什麼,或者幫助人們理解爲什麼這是一個有用/有用的答案。請參閱[我如何寫出一個好的答案?](http://stackoverflow.com/help/how-to-answer) – dic19

0

我沒有用它自己,但最近遇到InfluxDB這聽起來像它可能滿足你的標準來 - 一個開放源碼的時間序列數據庫建在aggregation queries - 例如

SELECT MEAN(column_name) FROM series_name group by time(10m)