我有一个传感器发送一个值说5分钟。它与时间戳一起存储在表中。我使用下面的代码在过去24小时内检索该传感器的所有值。
series = sensor.raindata.all(:order => "time_stamp", :conditions => {:time_stamp => Date.today...Date.today+1} )
但是由于传感器我们每5分钟更新一次,这是一个巨大的数据。我如何每小时对一个数据点进行采样?那就是每小时我需要一个传感器值。 (我不需要每小时的平均值。每小时只需一个样本)
实现这一目标的最优雅方式是什么?是否可以修改上述查询以获取此类数据?或唯一的方法是通过后期处理'系列'数组?
由于 Shaunak
答案 0 :(得分:1)
执行此操作的方法可能是使用SQL。这是一个例子,虽然我不得不对你的设置做出很多假设。 我假设:
所以,有了这些免责声明,这就是例子:
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对象(排序),每个对象都响应.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
我希望这有用。