:Car に属するモデル Laps があります。
したがって、各車には多くのラップがありますが、上位 10 の最速ラップを取得するクエリを実行する必要がありますが、各車の最速ラップのみを取得します。言い換えれば、リストの上位 10 位のファステストラップのうち 5 位を 1 台の車が占めることを許可したくありません。
各ラップには :car_id フィールドがあります。この列でグループ化し、グループ化から min(Lap.time) 行でラップを引き出します。(その一意の :car_id からの AKA ファステストラップ タイム)。
では、Postgres では、これに対する私の最善のアプローチは何ですか? 最初にすべてのラップを注文してからグループ化し、グループから最初のラップを取得できますか? または、グループ化はソート順を維持しませんか?
ラップモデルの私のスキーマは次のとおりです。
create_table "laps", force: true do |t|
t.decimal "time"
t.string "video_url"
t.integer "car_id"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "user_id"
t.boolean "approved"
end
これには、2 つの組み合わせたクエリを使用する必要がありますか?
これを行うことで、一意の車の ID のラップを取得できます。
select('DISTINCT ON (car_id) *')
しかし、その car_id ごとに min(lap.time) を取得するようにラップを注文する必要があります。だから私がこのような注文を投げるとき:
select('DISTINCT ON (car_id) *').order('car_id, time ASC').sort_by! {|ts| ts.time}
これは機能しますが、奇妙な方法のようです。注文からcar_idを削除するなど、注文を変更しようとするとすぐに、postgresエラーが発生します。