繁体   English   中英

使用pl-sql过程从玩家数据库中选择最佳团队

[英]Using a pl-sql procedure to select best team from players database

我正在使用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名最佳攻击者(最高的Attack_skill),4名最佳中场球员(最高的passing_skill),3名最佳防守者(最佳的defence_skill)和1名最佳GK(最佳的GK_skill)。

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

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

如果您忽略由于不同的技能而可能多次选择同一位玩家,则查询可能如下所示:

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;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM