-1

score, event_id, user_id와 같은 녹음 항목이라는 테이블에 4 개의 열이 있으며 사용자 ID + 이벤트 ID 인 을 기반으로 한 녹음의 점수를 합산하고 싶습니다. 점수별로 정렬 된 여러 이벤트의 사용자를 표시하려고합니다. 다른 열을 기반으로 레코드 그룹 정렬

그래서 나는

Recording.select("user_id,event_id,sum(score) as score").group(:user_id,:event_id).order("score DESC") 

및 위의 쿼리가 너무 분 점수 내가 다시 원하는

#<Recording user_id: 4, event_id: 51, score: 64622>, 
#<Recording user_id: 3, event_id: 51, score: 5912> 
#<Recording user_id: 4, event_id: 31, score: 62>, 
#<Recording user_id: 3, event_id: 48, score: 0> 

그러나

아래처럼 최대 점수에 따라 레코드를 출력 결과를 arrabge 아래의 코드를 wriiten있다 아래처럼 (점수 별 정렬 된 다른 이벤트의 사용자)

#<Recording user_id: 4, event_id: 51, score: 64622>, 
#<Recording user_id: 4, event_id: 31, score: 62>, 
#<Recording user_id: 3, event_id: 48, score: 0>, 
#<Recording user_id: 3, event_id: 51, score: 5912> 
+0

, USER_ID를 &이 질문은 매우 명확하지 – loganathan

+0

을 EVENT_ID : u는이 작업을 수행하기 위해 윈도우 기능을 사용할 수 있습니다. 귀하의 예에서는 텍스트가 설명하지 못한 것을 분명하게 설명합니다. @PinnyM의 명예는 더 많은 코멘트를 한 후 그것을 알아 낸 것 같다. –

답변

1

PostgreSQL의 경우, 나는 두 개의 열이있는 레코드를 그룹화하고

select_sql <<-SELECT 
    user_id, event_id, sum(score) as score, 
    ROW_NUMBER() OVER (PARTITION BY user_id, event_id ORDER BY sum(score) DESC) as rowNum 
SELECT 

subquery = Recording.select(select_sql).group(:user_id, :event_id).to_sql 

Recording.select("*").from(Arel.sql("(#{subquery}) t")). 
      order("rowNum, score DESC") 
+0

event_id와 score로 레코드를 정렬하고 싶지는 않습니다. 각 이벤트의 점수에 따라 레코드를 정렬하고 싶습니다. belwo처럼 – loganathan

+0

반환 된 점수 (64622, 5912, 62, 52)는 내림차순이 아닌 것으로 생각하십니까? 점수를 주문하기 위해 다른 논리를 사용하고 싶습니까? – PinnyM

+0

점수로만 기록하지 않고 각 이벤트의 최대 점수로 기록을 다시 정렬하려고합니다. 말해 만약 우리가 세 가지 이벤트가 있다면 출력은 첫 번째 3 레코드가 각 이벤트의 처음 3 최대 값을 가져야하고 두 번째 3 레코드는 각 이벤트의 두 번째 3 최대 점수를 가져야합니다. – loganathan

관련 문제