0

我使用Rails 4與PostgreSQL,我有一個表引號隨機時間填充。有時兩個條目相隔幾毫秒,有時幾個小時(交易日結束)。我想在過去的一年內建立一個報價圖。高效的數據庫查詢軌道

現在我使用

quotes = Quote.where(:created_at => 1.year.ago.beginning_of_day..Time.now.end_of_day).select(:price, :created_at) 

來完成這項工程,但我不需要(或希望)精確到毫秒的所有數據。我想每隔1小時輪詢數據庫只有1個報價,但我不確定如何構建查詢。我當然可以從數據庫中得到所有的引號,然後解析它們並丟棄大部分,但這看起來像浪費了資源和時間。

另外,請讓我知道,如果這似乎是一個非常低效的方式從數據庫中獲取報價。作爲一個附註,數據庫服務器在主從配置中設置,這些引用讀取來自從服務器的請求。

回答

0

我不知道這是否是最好的解決方案,但我還沒有完全確定它的基準,但我認爲我會把它放在那裏,或許可以幫助其他類似的情況。請糾正我,如果這不是一個格式正確的查詢。

def get_quotes_3months(stock_symbol)  
    @results = [] 
     ActiveRecord::Base.connection.select_all(
      ActiveRecord::Base.send(:sanitize_sql_array, [" 
      select price, created_at, symbol 
      from (
       select price, created_at, symbol, 
         row_number() over (partition by date_trunc('hour', created_at) order by created_at) as r 
       from quotes 
       ) as dt 
      where r = 1 AND created_at BETWEEN current_timestamp - INTERVAL '3 month' AND current_timestamp AND symbol = ?;", stock_symbol] 
     )).each do |record| 

      @results << {price: record["price"], created_at: record["created_at"].to_datetime} 
     end 
    return @results 
end 

基本上我分區表成組,按小時,然後通過created_at下令各組,把第一行各自小組。我還對查詢進行了清理,因爲輸入將來自javascript ajax請求(在此步驟之前進行了清理,但爲了以防萬一,我構建了冗餘)。

要弄清楚的最後一件事是如何將分區更改爲按其他時間範圍進行分組(即,如果我想每15分鐘引用一個引號,則調用date_trunc('15分鐘',created_at)沒有意義。