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