IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Besoin d'aide sur ROW NUMBER et GROUP BY


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2023
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2023
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Besoin d'aide sur ROW NUMBER et GROUP BY
    Bonjour,
    Après de nombreuses heures de recherche, je n'ai pas trouvé la réponse à mon problème.
    J'ai du mal chercher.

    Voilà, je souhaite réaliser un "top" sur mon projet PHP,
    pour cela j'ai une table de données contenant plusieurs données de parties de joueurs.

    Nom : Capture d’écran 2023-04-18 à 01.38.58.png
Affichages : 220
Taille : 75,5 Ko

    Voici le code utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT idu_user, idu_game, level, ROW_NUMBER() OVER(ORDER BY level DESC) AS rank FROM `games_playing` WHERE idu_game = '6413822783152' ORDER BY level DESC
    Je n'arrive pas à comprendre la logique pour pouvoir regrouper le même idu_user afin d'avoir un classement réel en utilisant le 1er de chaque groupe.
    J'ai essayé GROUP BY mais ça ne fonctionne pas comme je le veux...

    Merci par avance!

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 159
    Points : 1 949
    Points
    1 949
    Par défaut
    Bonjour,

    Si tu veux pour chaque joueur alors ajoute une clause PARTITION BY:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ROW_NUMBER() OVER(PARTITION BY idu_user ORDER BY level DESC)

  3. #3
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 240
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 240
    Points : 8 516
    Points
    8 516
    Billets dans le blog
    17
    Par défaut
    Pour un classement il y a RANK() et DENSE_RANK()
    À savoir que ces fonctions d'analyse sont exécutées après le GROUP BY

    Je ne vois pas trop ce qui justifie un level NULL
    Effectuer un tri avec du NULL est périlleux => Il faut les valoriser 0 ou les sortir

    Si tu veux un classement selon le plus haut niveau de chaque joueur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    with dataset (idu_user, level) as (
    	values 
    		row ('5309...', 16),
    		row ('5309...', 8),
    		row ('5309...', 7),
    		row ('7662...', 2),
    		row ('1046...', null),
    		row ('7662...', null),
    		row ('1111...', 2) -- Pour tester le classement selon l'égalité
    )
    select all
    	idu_user, 
    	max(coalesce(level, 0)) as lmax,
    	rank() over (order by max(coalesce(level, 0)) desc) as dr,
    	dense_rank() over (order by max(coalesce(level, 0)) desc) as r
    from dataset
    group by idu_user
    order by r asc
    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    idu_user	lmax	d	dr
    5309....	16	1	1
    7662....	2	2	2
    1111....	2	2	2
    1046....	0	4	3

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Si le SGBD le permet, vous pouvez trier par order by level desc nulls last dans les rank / dense_rank.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2023
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2023
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Pour un classement il y a RANK() et DENSE_RANK()
    À savoir que ces fonctions d'analyse sont exécutées après le GROUP BY

    Je ne vois pas trop ce qui justifie un level NULL
    Effectuer un tri avec du NULL est périlleux => Il faut les valoriser 0 ou les sortir

    Si tu veux un classement selon le plus haut niveau de chaque joueur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    with dataset (idu_user, level) as (
    	values 
    		row ('5309...', 16),
    		row ('5309...', 8),
    		row ('5309...', 7),
    		row ('7662...', 2),
    		row ('1046...', null),
    		row ('7662...', null),
    		row ('1111...', 2) -- Pour tester le classement selon l'égalité
    )
    select all
    	idu_user, 
    	max(coalesce(level, 0)) as lmax,
    	rank() over (order by max(coalesce(level, 0)) desc) as dr,
    	dense_rank() over (order by max(coalesce(level, 0)) desc) as r
    from dataset
    group by idu_user
    order by r asc
    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    idu_user	lmax	d	dr
    5309....	16	1	1
    7662....	2	2	2
    1111....	2	2	2
    1046....	0	4	3
    Effectivement, le level est désormais par défaut à 0, c'était une erreur de ma part.
    Merci beaucoup je crois comprendre un peu mieux, je vais tester ça pour voir ce que ça peut donner !

    Citation Envoyé par vanagreg Voir le message
    Bonjour,

    Si tu veux pour chaque joueur alors ajoute une clause PARTITION BY:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ROW_NUMBER() OVER(PARTITION BY idu_user ORDER BY level DESC)
    J'avais essayé mais malheureusement ça ne fonctionnait pas...

    Merci en tout cas pour les pistes, je vais essayer et revenir éditer ce message pour vous dire ce qu'il en ai !

Discussions similaires

  1. Besoin d'aide sur group by
    Par Juwan dans le forum BIRT
    Réponses: 2
    Dernier message: 19/09/2012, 10h37
  2. [D7] Besoin d'aide sur un PChar
    Par bobby-b dans le forum Langage
    Réponses: 6
    Dernier message: 30/06/2004, 16h42
  3. Filemaker ... besoin d'aide sur les Plugin
    Par joange dans le forum Autres SGBD
    Réponses: 3
    Dernier message: 22/04/2004, 10h16
  4. [intermedia] besoin d'aide sur script PL/SQL
    Par SteelBox dans le forum PL/SQL
    Réponses: 8
    Dernier message: 05/01/2004, 19h59
  5. [CR] besoin d'aide sur les formules
    Par GuillaumeDSA dans le forum Formules
    Réponses: 4
    Dernier message: 10/07/2003, 12h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo