Ruby on Rails: получение значения за каждый час за последние 24 часа - PullRequest
0 голосов
/ 19 января 2012

У меня есть датчик, который посылает значение, скажем, 5 минут.Это хранится в таблице вместе с отметкой времени.Я использую приведенный ниже код для получения всех значений этого датчика за последние 24 часа.

series = sensor.raindata.all(:order => "time_stamp", :conditions =>  {:time_stamp => Date.today...Date.today+1} )

Но поскольку датчик обновляется каждые 5 минут, это огромные данные.Как мне выбрать только одну точку данных каждый час?То есть мне нужно одно значение этого датчика на каждый час.(Мне не нужно среднее значение за каждый час. Всего один образец в час)

Какой самый элегантный способ достижения этого?Можно ли изменить приведенный выше запрос для получения данных такого типа?или единственный способ сделать это - обработать массив 'series'?

Спасибо, Шаунак

1 Ответ

1 голос
/ 19 января 2012

Способ сделать это, вероятно, с помощью 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

Надеюсь, это полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...