2013-06-02 3 views
1

J'utilise Oracle Developer 11g. J'ai une base de données de 100 joueurs de football. J'ai une table appelée PROFILE_PLAYERS qui a des colonnes suivantes:Utilisation d'une procédure pl-sql pour sélectionner la meilleure équipe de la base de données des joueurs

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

Maintenant, je veux former une équipe de 11 joueurs qui contient 3 meilleurs attaquants (le plus attack_skill), 4 meilleurs milieux de terrain (le plus passing_skill), 3 meilleurs défenseurs (meilleure défense_skill) et 1 meilleur GK (meilleur GK_skill).

Je veux écrire une procédure qui affiche les 11 meilleurs joueurs avec leurs nom joueur et joueur. Puis-je utiliser rank() ici? Dois-je utiliser pour la boucle avec un compteur dans la procédure?

+1

Cela peut tout être fait dans une seule instruction SQL; vous n'avez pas besoin d'utiliser PL/SQL du tout. Maintenant, vous savez, à quel point pensez-vous que vous pouvez l'essayer par vous-même? Vous pensez que vous devriez utiliser 'rank()', l'avez-vous essayé? Obtenez-vous les résultats que vous voulez? Si non, _why_? C'est la question que vous devriez constamment vous poser, _why_? C'est aussi la question que vous devriez constamment poser aux autres si vous ne comprenez pas leur explication de quelque chose. Vous ne comprendrez jamais et ne serez pas en mesure d'entreprendre vous-même toute tâche de programmation. – Ben

+0

c'est une question intéressante. Je pense que vous devez définir un ordre pour évaluer les compétences. par exemple, si un attaquant n ° 1 est également n ° 1 défenseur - que considérez-vous être? Comme dit @Ben, la fonction de classement est ce que vous cherchez. – haki

+0

@haki, je n'ai pas dit que la fonction 'rank()' était ce que l'OP recherchait, je ne pense pas que ce soit parce qu'il y a des trous dans la séquence. En théorie, vous n'avez pas du tout besoin d'utiliser une fonction analytique. – Ben

Répondre

1

Si vous ignorez que le même joueur pourrait être sélectionné plus d'une fois en raison de différentes compétences, la requête pourrait ressembler à ceci:

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; 

Pour être sûr que vous obtenez exactement 11 joueurs, vous devez appliquer quelques trucs:

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; 

vous pouvez ensuite enrouler cette requête dans une procédure stockée si vous avez vraiment besoin d'avoir une procédure.

+2

probablement vous devriez utiliser dense_rank au lieu de rank - il vous permettra d'éviter les astuces rownum. –

+0

S'il y a 20 joueurs, tous ayant exactement les mêmes compétences, dense_rank n'aidera pas. – Codo

Questions connexes