2013-09-22 4 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-м пунктах тоже сделают это.

Вариант использования Я хочу построить это в графике, но не хочу слишком много точек, чем необходимо. Поэтому для построения графика в течение года я предпочел бы запрашивать только пару очков в день. В то время, когда вы планируете в течение дня, я хотел бы наметить точку каждую минуту или около того.

Я могу сделать все это в PHP, но есть ли способ сделать это непосредственно в базе данных? Если нет, я рассматриваю использование базы данных временных рядов, но бюджетные ограничения ограничивают меня только свободными. Есть ли бесплатная база данных временных рядов, которая выдает выборку и предпочтительно интерполяцию?

+0

возможно дубликат [ Sampling 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

Добро пожаловать в 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) 
Смежные вопросы