J'ai des tables joueurs et des allumettes et je souhaite trouver des joueurs avec des points max, notez que le joueur avec une pièce d'identité plus bas est gagnant dans chaque groupe si des scores correspondent.
group_id | winner_id ----------+----------- 1 | 45 2 | 20 3 | 40
4 Réponses :
Utiliser Démo sur db violon strong>: p> Remarque: il n'y a qu'un joueur dans le groupe 3 (joueur_id 40 ), et ils n'ont participé à aucun jeu. P> p> rang_number () code>:
Sans Row_Number>
Valeur retournée: + --- + ---- + | 1 | 65 | | 2 | 20 | + --- + ---- +
@YAN: Il n'y a qu'un joueur dans le groupe 3 (joueur_id 40), et ils n'ont participé à aucun match.
Je pense que l'approche la plus simple est une jointure latérale et ICI est un dB <> violon. P> P> distincte sur code>:
Approche prise:
Pour le tableau 2, nous recevrons le gagnant et le score correspondant pour chaque joueur Et ensuite, nous allons regrouper les joueurs à calculer la somme globale p>
Une fois que cette table ci-dessus sera jointe au tableau 1 qui donnera le score de chaque joueur dans les groupes, nous trierons ces données en fonction du groupe et Score p>
Ensuite, nous sélectionnerons le premier enregistrement de chaque groupe qui donnera les résultats requis p>
SELECT GROUP_ID, PLAYER_ID, MAX_SCORE FROM ( SELECT GROUP_ID, PLAYER_ID, MAX_SCORE, DENSE_RANK() OVER(PARTITION BY GROUP_ID ORDER BY MAX_SCORE DESC,PLAYER_ID ASC) RANK FROM ( SELECT DISTINCT GROUP_ID, PLAYER_ID, COALESCE(MAX(TOT_SCORE)OVER (PARTITION BY PLAYER_ID),0)MAX_SCORE FROM ( SELECT PLAYER_ID, GROUP_ID, TOT_SCORE FROM ( SELECT PLAYER, SUM(SCORE) AS TOT_SCORE FROM ( SELECT FIRST_PLAYER AS PLAYER,SUM(FIRST_SCORE)AS SCORE FROM MATCHES GROUP BY FIRST_PLAYER UNION SELECT SECOND_PLAYER AS PLAYER,SUM(SECOND_SCORE)AS SCORE FROM MATCHES GROUP BY SECOND_PLAYER ) GROUP BY PLAYER )S RIGHT JOIN PLAYERS P ON S.PLAYER=P.PLAYER_ID ))) WHERE RANK=1