1

我正在使用 oracle SQL developer 11g。我有一个包含 100 名足球运动员的数据库。我有一个名为PROFILE_PLAYERS的表,其中包含以下列:

player_id, player_name, attack_skill(number),
defense_skill(number), passing_skill(number), GK_skill(number)

现在,我想组建一支由 11 名球员组成的球队,其中包括 3 名最佳攻击手(最高攻击技能)、4 名最佳中场(最高传球技能)、3 名最佳后卫(最佳防守技能)和 1 名最佳 GK(最佳 GK_skill)。

我想编写一个程序,显示 11 名最佳球员及其 player_name 和 player_id。

我可以在这里使用 rank() 吗?我应该在程序中使用带有计数器的 for 循环吗?

4

1 回答 1

1

如果您忽略同一玩家可能因技能不同而多次被选中,则查询可能如下所示:

select player_id, player_name
from (
    select player_id, player_name,
        rank() over(order by attack_skill desc) attack_rank,
        rank() over(order by defense_skill desc) defense_rank,
        rank() over(order by passing_skill desc) passing_rank,
        rank() over(order by gk_skill desc) gk_rank
    from profile_players
)
where attack_rank <= 3 or defense_rank <= 4
   or passing_rank <= 3 or gk_rank <= 1;

为确保您获得正好 11 名玩家,您必须应用一些技巧:

select player_id, player_name
from (
    select player_id, player_name,
        least((attack_rank - 1) / 3, (defense_rank - 1) / 4,
            (passing_rank - 1) / 3, gk_rank - 1) blended_rank
    from (
        select player_id, player_name,
            rank() over(order by attack_skill desc) attack_rank,
            rank() over(order by defense_skill desc) defense_rank,
            rank() over(order by passing_skill desc) passing_rank,
            rank() over(order by gk_skill desc) gk_rank
        from profile_players
    )
    order by blended_rank desc
)
where rownum <= 11;

然后,如果您确实需要一个过程,则可以将此查询包装到一个存储过程中。

于 2013-06-02T08:59:51.347 回答