棘手的查询:仅获取最新记录的平均值

时间:2013-11-21 08:02:44

标签: sql ruby-on-rails activerecord

我有三种模式:

Supplier
  |
Price - Book
  |
PriceType

价格是其他三个模型的联合表。

每月都会收集最新价格。因此,每个图书/供应商/价格类型组合都有多个价格,在不同的时间点收集。只有这个组合的最后价格是我感兴趣的价格。

我现在想知道,特定PriceType /供应商组合的所有图书的平均价格是多少,忽略除特定组合的最后价格之外的所有价格。

有没有办法在数据库(Postgres)级别上执行此操作,而不是像这样写一些非常慢的东西:

prices = []    
Supplier.first.books.each do |book|
  latest_price_for_book = Price.joins(:price_type, :book).where("price_types.id = ? AND books.id = ?", PriceType.first, book).last
  prices << latest_price_for_book.price
end
average = prices.sum / prices.size.to_f

1 个答案:

答案 0 :(得分:1)

我不知道你在哪里使用book变量。你的代码与你的解释略有不同。无论如何,您可以使用聚合函数来获得更快的结果。

Price
  .where("price_types.id = ? AND suppliers.id = ? AND books.id = ?", 
    @price_type, @supplier, @book)
  .average(:<column_with_price>)

如果您想要每本图书的平均价格,那么您只需要group by图书ID。