2013-11-21 65 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