我不知道这是否是最好的解决方案,但我还没有完全确定它的基准,但我认为我会把它放在那里,或许可以帮助其他类似的情况。请纠正我,如果这不是一个格式正确的查询。
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)没有意义。