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. 比赛:competition_id
  2. 参赛者:contestant_id
  3. GroupContestant:contestant_group_id、competition_d、group_number、contestant_id
  4. 结果:concentant_group_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;
4

2 回答 2

1

分析功能来拯救。要为每组选择前 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;

注意你如何解决关系(考虑使用rankordense_rank代替row_number)。

于 2014-05-23T07:37:54.563 回答
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

于 2014-05-23T08:26:34.487 回答