2013-11-21 38 views
0

我有三个型号:整蛊查询:仅获得的平均最新记录

Supplier 
    | 
Price - Book 
    | 
PriceType 

价格是其他三款车型接合表。

每个月都会收集到最新的价格。因此,每本图书/供应商/ 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

我没有看到你所使用的book变量。而你的代码与你的解释有点不同。无论如何,你可以使用聚合函数来获得更快的结果。

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

如果你想要一个平均价格为每本书,你只需要group by书籍ID。

+0

对于每本书,我只想使用最新价格,然后获得特定PriceType/Supplier组合的平均值。 – migu

+0

我更正了代码,因此它按预期使用书籍变量。 – migu