Способ сделать это, вероятно, с помощью SQL.Вот пример, хотя мне пришлось сделать много предположений о вашей настройке, чтобы дать его.Я предполагаю:
- вы используете Rails 3, и, следовательно, можете использовать этот синтаксис
- у вас есть модель с именем Sensor, каждый объект которого считывается с датчикас полями time_stamp и чтением
- среднее значение показаний за час является приемлемым значением для этого часа
- , что ваша база данных представляет собой разновидность SQL (пример работает в PostgreSQL, незначительныйдля других могут потребоваться модификации)
Итак, с этими отказами от ответственности, вот пример:
Sensor.select('avg(reading) as avg_reading, extract(hour from time_stamp) as hour').where(:time_stamp => Date.today...Date.today+1).group('extract(hour from time_stamp)').order('hour')
Это даст вам коллекцию объектов Sensor (сортировкаof), каждый из которых отвечает на .hour
и .avg_reading
.
В качестве альтернативы (если, например, вы не на Rails 3), вы должны пытаться выполнить запрос SQL, который выглядит как-товот так (вставляя даты, где указано):
SELECT AVG(reading) AS avg_reading, EXTRACT(HOUR FROM time_stamp) AS hour FROM sensors WHERE time_stamp > {start date} AND time_stamp < {end date} GROUP BY EXTRACT(HOUR FROM time_stamp) ORDER BY hour
Надеюсь, это полезно.