2016-09-08 2 views
0

У меня есть таблица «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 секундный интервал от времени» '.

Пока у меня есть этот mySQL, чтобы получить данные с интервалом, но это не работает для меня, я имею в виду, что это слишком медленно (я ждал 30 минут для таблицы с 2 миллионами строк).

Мне нужно добавить 2 столбца avg (dx) и avg (dy), которые являются средними значениями за последние 0,4 секунды.

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

Точно, какой тип среднего вы пытаетесь получить - похоже, ваш запрос даст среднее значение для каждого из двух миллионов записей - средние значения находятся в пределах 0,4 секунды, что приводит к эффективному скользящему среднему. Это означает, что вам нужно сравнить 2 миллиона записей с 2 ​​миллионами записей - следовательно, медленно. Если вы хотите разделить 2 миллиона записей на 0,4 секунды и принять среднее значение из них - вернув гораздо меньше, чем 2 миллиона записей, то вы, вероятно, можете значительно ускорить процесс. – PaulF

+0

Я пробовал следующий запрос: [code] select AVG (dx), from_unixtime (ROUND (Time/(60 * 0.00666)) * 60 * 0.00666) как rounded_time от auto.cardoor1 группа by 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 timegroup GROUP BY Time1; _ усреднение по ожидаемому числу результатов. – PaulF

ответ

-1

Если вам не нужен результат скользящего среднего типа, то применение бит математики к столбцу времени позволит запросить без соединения.

Это работало правильно меня:

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

деления времени на требуемое время разделения, вокруг него на целое & затем умножить обратно на время деления - дать все записи в то время блокировать то же время , Затем просто группируйте по Time1 & в среднем два других столбца.

+0

Любая причина для голосования после всего этого времени после принятия ответа - может быть, лучший метод решения проблемы? – PaulF

Смежные вопросы