2014-05-22 2 views
1

내 이상한 제목에 대해 유감 스럽지만 정확히 무엇을 찾고 있는지 알 수 없습니다. 작업은 아주 간단합니다. 나는 대회 테이블을 가지고있다. 다른 테이블 그룹. 모든 그룹에는 몇 명의 참가자가 있습니다. 마지막 테이블에는 참가자의 결과가 저장됩니다. 과제는 모든 그룹의 참가자 중 처음 세 명을 얻는 것입니다.오라클 저장 프로 시저 - 변수의 점진적인 구축

그래서 그룹을 반복하고, 모든 그룹의 처음 세 참가자 (달성 점수에 따라)를 얻고 변수에 추가해야합니다.

CREATE OR REPLACE PROCEDURE get_first_three_of_all(contestants OUT SOME_TYPE) AS 
    CURSOR groups SELECT... 
BEGIN 
    FOR group IN groups LOOP 
     APPEND(contestants, get_first_three_of_one_group(group.id)) 
    END LOOP; 
END; 

나는이 작업을 해결하는 방법, 아무 생각이 : 여기

은 의사입니다. 나는 무엇을 찾아야할지 모른다. 너는 친절하고 도와 주시겠습니까? 감사.

편집 : 내 테이블의 단순화 된 구조 :

  1. 경쟁 :, 심사 위원을 contestant_group_id :
  2. 참가자를 competition_id :
  3. GroupContestant contestant_id : contestant_group_id, competition_d,은 group_number을
  4. 결과를 contestant_id 포인트

선택 한 그룹 (그룹 번호 YYY)의 데이터를 얻을 수는 여기 : 구조에

SELECT * FROM (
     SELECT res.contestant_group_id, SUM(res.points) AS points 
     FROM Result res 
     WHERE res.couple_group_id IN (SELECT couple_group_id 
             FROM GroupContestant 
             WHERE competition_id = XXX 
             AND group_number = YYY) 
    GROUP BY res.contestant_group_id 
    ORDER BY points DESC 
) 
WHERE ROWNUM <= 3; 
+0

구조체를 기술하십시오. 쿼리를 사용하면 대답을 쉽게 얻을 수 있습니다. 왜 저장 프로 시저를 사용하고 싶습니까? –

+0

고맙습니다. 게시물을 편집하고 간단한 쿼리로 단순화 된 데이터베이스 구조를 추가하여 한 그룹의 데이터를 선택했습니다. 저장 프로 시저를 사용할 필요는 없지만 쿼리로 결과를 얻는 방법을 모르겠습니다. 도와 주시겠습니까? 왜 내가 downvote있어? – Honza

답변

1

Analytic functions. 각 그룹에 대한 각 대회 상위 3 개 결과를 선택하려면 : 당신이 관계를 해결하는 방법을

SELECT * FROM (
    SELECT grp.competition_id, grp.group_number, res.contestant_group_id, res.points, 
      row_number() over (partition by grp.competition_id, grp.group_number 
            order by res.points desc) rn 
     FROM (SELECT contestant_group_id, SUM(points) AS points 
       FROM Result 
      GROUP BY contestant_group_id) res 
     JOIN GroupContestant grp ON (grp.contestant_group_id = res.contestant_group_id) 
) 
WHERE rn <= 3; 

에주의를 (rank 또는 dense_rank 대신 row_number의 사용을 고려).

1

당신은 목표를 달성하기 위해 RANK() 분석 기능을 사용할 수 있습니다 : 여기

select * 
    from (select group_num, 
       points, 
       rank() over(partition by group_num order by points desc) rank 
      from results 
     inner join group_contestant 
     using (contestant_group_id)) 
where rank <= 3 
order by group_num, points desc; 

은 놀 SQLFiddle입니다.