2012-01-18 85 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