1

그룹화 내가 속한 모델 바퀴가로 : 자동차레일 - 액티브 쿼리 : 열 ASC 정렬 한 다음 열

그래서 각 차량은 많은 바퀴를 가지고,하지만 난 쿼리를 할 필요가 어디에서 톱 10의 가장 빠른 랩에 당긴다. 그러나 단지 각 차당 가장 빠른 무릎을 당긴다. 다시 말해, 한 대의 자동차가 목록에서 상위 10 위의 가장 빠른 랩 중 5 번을 차지하는 것을 허용하지 않기를 바란다.

각 랩에는 : car_id 필드가 있습니다. 이 열을 그룹화 한 다음 그룹에서 min (Lap.time) 행으로 무릎을 당깁니다. (일컬어 가장 빠른 무릎 시간 : car_id).

그래서 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 

나는이 두 가지 조합 된 쿼리를 사용해야합니까? 내가 그 car_id 당 분 (lap.time)를 얻을 수 있도록 바퀴를 주문해야,

select('DISTINCT ON (car_id) *') 

하지만 :

나는이 작업을 수행하여 독특한 자동차 아이디의 무릎을 얻을 수 있습니다. 그래서 다음과 같은 명령을 내리면 :

select('DISTINCT ON (car_id) *').order('car_id, time ASC').sort_by! {|ts| ts.time} 

이것은 효과가 있지만 이상하게 보입니다. 마자 나는 순서대로 car_id를 제거하는 것 같은 순서를 바꾸려고 노력할 때마다 postgres 오류가 발생합니다.

+0

아마도 이것입니까? group ('laps.id, laps.car_id'). limit (10)' – MrYoshiji

+0

방금 ​​시도 했어요. 그것은 나에게 같은 car_id에서 여러 바퀴를 준다 –

+0

이것은 내가했던 것과 그 독특한 car_id의 빠른 것을 얻는 것이다. 그러나 나는 그것을 디버깅 할 때 그것이 보이는 시간에 따라 정렬되지 않는다. 더 좋은 방법이 있다면 답을 게시 해주세요 : select ('DISTINCT ON (car_id) *') order ('car_id, time ASC') –

답변

0

이것은 내가 한 것과 그 작업입니다. 내 모델

: 답변을 게시하시기 바랍니다 다음에 대해 갈 수있는 더 좋은 방법이 있다면

당신이 발견하고 따라, DISTINCT ON 그것이 아무튼 때문에 여기 당신을 위해 작동하지 않을
def self.fastest_per_car 
    select('DISTINCT ON (car_id) *').order('car_id, time ASC').sort_by! {|ts| ts.time} 
end 
+0

나는 sort_by에서 멀리 떨어져있을 것입니다! 그리고 루비 데 무거운 로딩 당신의 DB를 돌봐해야합니까 –

4

정렬 할 첫 번째 용어와 일치하지 않습니다 (시간). 다음과 같은 방법으로 그룹을 사용해야합니다 : 또는 당신이 윈도우 하위 쿼리를 만들 수 있습니다

Lap.group(:car_id).limit(10).minimum(:time) 

- 그러나 그것은 건설 상당히 지저분하다. 잠시 동안 실제 랩타임 정보가 필요하다면, 그 경로를 따라 가야 할 수도 있습니다 :

subquery = Lap.select('lap.*, ROW_NUMBER() OVER (PARTITION BY car_id ORDER BY time, car_id) as rowNum').to_sql 
Lap.scoped.from(Arel.sql("(#{subquery}) fast_laps")) 
    .where('rowNum = 1') 
    .order('time, car_id') 
    .limit(10) 
+0

나는 이미 이것을 시도했지만 얻을 : PG :: InvalidColumnReference : 오류 : SELECT DISTINCT ON 식은 초기 ORDER BY 식과 일치해야합니다. 선택 주문이나 다른 것을 변경해야합니까? –

+0

@JoelGrannas, 맞아 -이게 효과가 없을거야. 대체 답변으로 업데이트되었습니다. – PinnyM

+0

나는 랩 정보 (시간, ID, mph, video_url)가 필요합니다.창 하위 쿼리에 대해 자세히 설명하거나 해당 메서드를 제공 할 수 있습니까 –