2017-04-07 10 views
0

DailyDatumが多いCompanyがあります。 DailyDatumは、dateおよびvolumeの列を有する。最近のn個のアイテムをActiveRecordで平均する方法

class Company < ActiveRecord::Base 
    has_many :daily_data 
end 

最近平均1volumesを取得したいと考えています。このコードによって、私は

company = Company.first 
company.daily_data.order(date: :desc).limit(10).pluck(:volume).mean 

(私はArray#meanメソッドを実装)。平均値を持って、私は私がPostgresqlAVG機能を使用する場合、それはより多くのefficiantだと思いました。何とかorderはこのように無視されます。

company.daily_data.order(date: :desc).limit(10).average(:volume) 
    (15.7ms) SELECT AVG("daily_data"."volume") FROM "daily_data" WHERE "daily_data"."company_id" = $1 LIMIT 10 [["company_id", 1123]] 

私はlimitorderaverageは同時に使用することはできますか?あなたがRailsの中でこれを行うこと

select avg(volume) from 
    (select volume from daily_data where company_id = 1 limit 10) as temp 

のようなクエリでサブクエリを使用する必要が

+1

日付で注文するかどうかは関係ありません。常に1行になるためです。 –

+0

idで降順でソートすると、レコード数が増えるほど効率的なインデックスになります。 – s1mpl3

答えて

0

はおそらくfind_by_sqlメソッドが含まれます。しかし、あなたは10レコードしか計算していないので、パフォーマンスの利点を気付かないと思います。

+1

もっと多くのレコードを計算する必要があるときは、私は 'find_by_sql'を使用します。 – ironsand

関連する問題