[英]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.