1

: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エラーが発生します。

4

2 に答える 2

0

これが私がやったことであり、その働きです。これらについてもっと良い方法がある場合は、回答を投稿してください。

私のモデルでは:

def self.fastest_per_car
    select('DISTINCT ON (car_id) *').order('car_id, time ASC').sort_by! {|ts| ts.time}
end
于 2013-09-03T16:19:29.813 に答える