0
votes

Comment obtenir Max Scoring Player de chaque groupe à l'aide de SQL?

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


0 commentaires

4 Réponses :


3
votes

Utiliser rang_number () : xxx

Démo sur db violon : xxx

Remarque: il n'y a qu'un joueur dans le groupe 3 (joueur_id 40 ), et ils n'ont participé à aucun jeu.


3 commentaires

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.



1
votes

Je pense que l'approche la plus simple est une jointure latérale et distincte sur : xxx

ICI est un dB <> violon.


0 commentaires

0
votes

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

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

Ensuite, nous sélectionnerons le premier enregistrement de chaque groupe qui donnera les résultats requis xxx


0 commentaires

0
votes
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

0 commentaires