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)没有意义。