MySQL中的时间序列数据:采样

Jug*_*kar 7 mysql time-series

我们有一个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 |
-------------------------------------
Run Code Online (Sandbox Code Playgroud)

数据在时间上间隔不均匀,有些点间隔一分钟,有些点间隔几秒钟.

有没有一种有效的方法可以查询此数据库以每n分钟/秒/小时提取数据?理想情况下,我希望在第一n分钟有(线性)插值,但最接近第一n分钟的点或最后一点或在第一n点之前也是如此.

用例是我想将其绘制成图形,但不要求太多的点.因此,对于一年的情节,我宁愿每天只查询几个点.在绘制一天的时候,我想每分钟左右绘制一个点.

我可以用PHP完成所有这些,但有没有办法在数据库中直接进行?如果没有,我正在考虑使用时间序列数据库,但预算约束限制我只使用免费的数据库.是否有任何自由时间序列数据库提供开箱即用的采样,最好是插值?

pau*_*923 1

我已经尝试过这个问题,我真的很想看看其他人如何解决它。

我之前遇到过类似的问题,并通过创建时间索引表,然后基于重写时间以适应时间范围来加入数据表来解决它。问题是您需要一个新的时间索引表和每个时间间隔的单独查询或视图。

以这种方式连接数据的优点是,我还对没有读数或结果的时间范围感兴趣,因此我需要查看某些时间范围内的空值或没有读数。最终数据只需要一些额外的工作(即:取出占位符)。

我做的第一件事是创建一个时间索引表,它看起来像这样......

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)
Run Code Online (Sandbox Code Playgroud)

然后我将我的数据合并到

( 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 
Run Code Online (Sandbox Code Playgroud)

我在我的旧桌子上测试了这个,它似乎工作正常,我必须重新编辑我的代码以适合您的示例,所以希望我在这样做时没有搞砸。