2012-01-18 49 views
0

我有一个传感器,发送的数值为5分钟。这与时间戳一起被存储在表中。我使用下面的代码在过去24小时内检索该传感器的所有值。Ruby on Rails:在过去的24小时内检索每小时的值

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

但作为传感器,我们每5分钟更新一次,这是巨大的数据。我如何每小时抽取一个数据点?那就是我需要每小时一个传感器的值。 (我不需要每小时的平均值,每小时只有一个样本)

实现此目的最优雅的方法是什么?是否可以修改上述查询来获取这种数据?或者只有这样做才是通过后期处理'系列'数组?

感谢 Shaunak

回答

1

做到这一点的方法可能是用SQL。这里有一个例子,尽管我必须对你的设置做很多假设才能给它。 我假设:

  • 你用Rails 3,从而可以使用这个语法
  • 您有一个名为传感器型号,其中每个 对象是从具有命名字段传感器的读数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') 

这会给你一个传感器对象(在某种程度上),每个响应.hour.avg_reading的集合。

或者(如果,例如,你不是on 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 

希望这很有帮助。

+0

另一种方法是按小时分组后选择“min(id)”的子选择;对于PostgreSQL:'select model。* from model where id in(通过date_trunc('hour',time_stamp)从模型组中选择min(id))by order_stamp'。尽管如此,你不得不为某些其他数据库设置“date_trunc”。 – 2012-01-18 22:16:22