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 :

GROUP BY bloqué ? quelle fonction d’agrégation ?


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Avril 2019
    Messages : 6
    Points : 6
    Points
    6
    Par défaut GROUP BY bloqué ? quelle fonction d’agrégation ?
    Bonjour,

    Je suis bloqué face à une petite requête.

    J'ai ces données:

    Name-----Date_Alpha----------Date_Beta-----------Date_Gamma----------Date
    Henry----03/09/2019----------07/03/2019----------01/07/2019----------05/01/2019
    Jack-----01/05/2019----------05/01/2019----------04/05/2019----------05/01/2019
    Jack-----03/06/2019----------03/06/2019----------02/06/2019----------01/02/2019
    Tom------03/06/2019----------08/03/2019----------02/08/2019----------03/02/2019
    Jon------05/01/2019----------02/05/2019----------02/02/2019----------05/02/2019
    Tom------03/07/2019----------01/03/2019----------03/01/2019----------07/03/2019
    Tom------05/05/2019----------04/05/2019----------04/04/2019----------03/04/2019
    Tom------06/03/2019----------03/06/2019----------04/03/2019----------03/04/2019
    Jon------06/05/2019----------03/06/2019----------04/03/2019----------09/04/2019
    Jon------06/06/2019----------04/06/2019----------05/04/2019----------02/05/2019
    Heny-----07/04/2019----------05/07/2019----------05/05/2019----------03/05/2019
    Jon------05/06/2019----------03/05/2019----------05/03/2019----------08/05/2019
    Heny-----01/06/2019----------06/01/2019----------06/06/2019----------02/06/2019
    Heny-----05/06/2019----------01/05/2019----------06/01/2019----------03/06/2019
    Heny-----03/06/2019----------03/06/2019----------07/08/2019----------05/07/2019
    Henry----09/09/2019----------06/09/2019----------08/06/2019----------01/08/2019
    Henry----06/05/2019----------05/06/2019----------08/05/2019----------02/08/2019
    Henry----09/04/2019----------06/09/2019----------08/06/2019----------06/08/2019
    Jack-----03/06/2019----------04/05/2019----------03/06/2019----------06/08/2019
    Jack-----04/03/2019----------05/04/2019----------09/05/2019----------08/09/2019

    Je voudrais trier les données et avoir les

    Name-----Date_Alpha-----Date_Beta------Date_Gamma-----Date
    Henry----03/09/2019-----07/03/2019-----01/07/2019-----05/01/2019
    Jack-----01/05/2019-----05/01/2019-----04/05/2019-----05/01/2019
    Tom------03/06/2019-----08/03/2019-----02/08/2019-----03/02/2019
    Jon------05/01/2019-----02/05/2019-----02/02/2019-----05/02/2019
    Je pensais faire une requête du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT `Table`.`Name` AS `Name`,
           `Table`.`Date_Alpha` AS `Date_Alpha`,
           `Table`.`Date_Beta` AS `Date_Beta`,
           `Table`.`Date_Gamma` AS `Date_Gamma`,
           max(`Table`.`Date`) AS `Date`
    FROM `Table`
    GROUP BY `Table`.`Name`,
    Mais je sais pas quelle fonction d’agrégation utiliser. J'ai regardé rapidement sur les sites mais sans résultat. Des idées?

  2. #2
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    776
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 776
    Points : 1 488
    Points
    1 488
    Par défaut
    Citation Envoyé par Dacodhack Voir le message
    Mais je sais pas quel fonction d’agrégation utiliser.
    Chaque fonction d'agrégation a une utilité propre.
    Le fait de faire un GROUP BY indique quelles sont les lignes à regrouper.

    D'après ton exemple, tu regroupes par nom.
    Mais que veux-tu pour chaque colonne de date ?

    Par exemple pour Henry, on a :
    Name	Date_Alpha	Date_Beta	Date_Gamma	Date
    Henry	03/09/2019	07/03/2019	01/07/2019	05/01/2019
    Henry	09/09/2019	06/09/2019	08/06/2019	01/08/2019
    Henry	06/05/2019	05/06/2019	08/05/2019	02/08/2019
    Henry	09/04/2019	06/09/2019	08/06/2019	06/08/2019
    Heny	07/04/2019	05/07/2019	05/05/2019	03/05/2019
    Heny	01/06/2019	06/01/2019	06/06/2019	02/06/2019
    Heny	05/06/2019	01/05/2019	06/01/2019	03/06/2019
    Heny	03/06/2019	03/06/2019	07/08/2019	05/07/2019
    En regroupant sur "NAME" on n'aura qu'une valeur (donc qu'une ligne) pour "Henry"
    Par contre pour Date_Alpha on veut, une au hasard, la plus ancienne, la plus revente, ... la bleue ?
    Et cette question on se la pose pour chaque colonne non regroupée.

    À partir de là on se met en quête de la fonction d'agrégation utile.
    Toujours à partir de ton exemple, il me semble que la fonction MIN() serait adaptée.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Avril 2019
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Effectivement, j'étais pas assez clair.
    Je voudrais que pour chaque utilisateur, avoir afficher toutes les dates (date_alpha, beta, gamma), mais regrouper que par la dernière des dates et le nom.

    Le code parfait serait un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT `Table`.`Name` AS `Name`,
           Last(`Table`.`Date_Alpha`) AS `Date_Alpha`, -- la date qui correspond à la `Table`.`Date` la plus haute 
           Last(`Table`.`Date_Beta`) AS `Date_Alpha`, -- la date qui correspond à la `Table`.`Date` la plus haute 
           Last(`Table`.`Date_Gamma`) AS `Date_Alpha`, -- la date qui correspond à la `Table`.`Date` la plus haute 
           max(`Table`.`Date`) AS `Date`
    FROM `Table`
    GROUP BY `Table`.`Name`,`Table`.`Date`
    Mais le min/max pose problème, si la date augmente mais le date_alpha diminue ou augmente sans depasser les bornes, on aura toujours soit le min soit le max. Et c'est pas ce que je souhaite.
    Je souhaite avoir la valeur quand date est à son max.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    776
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 776
    Points : 1 488
    Points
    1 488
    Par défaut
    Citation Envoyé par Dacodhack Voir le message
    Effectivement, j'étais pas assez clair.
    [...]
    Je souhaite avoir la valeur quand date est à son max.
    Quelle date doit être au "max" ? (et une fois répondu : que veux dire "avoir la valeur" ? La ligne ? une colonne particulière ?)
    Quelle différence fais tu entre max, min et "last" ?

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 240
    Points : 12 872
    Points
    12 872
    Par défaut
    Bonjour,
    Si je comprends bien, il faut pour chaque nom ne garder que la "dernière ligne" quand elles sont triées sur la colonne date (qui est un mot réservé…).

    On en revient à la question récurrente: la recherche du premier/dernier/plus grand/plus petit…

    Allez, un exemple avec une jointure externe:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select t1.*
    from MaTable as t1
    left outer join MaTable as t2 on t1.Id = t2.id and t1.coldate > t2.coldate
    where t2.id is null

    Tatayo.

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 302
    Points : 39 647
    Points
    39 647
    Billets dans le blog
    9
    Par défaut
    Question très récurrente, c'est la raison pour laquelle j'ai écrit un sujet de blog qui y est consacré
    Différentes solutions y sont proposées ici.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Avril 2019
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Oui c'est cela. Je vais donc devoir un join pour garder les lignes selectionné par deux conditions.
    Qui sera le nom et la date.
    Merci pour vos remarques.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Programme qui bloque avec fonction sort
    Par ultimate_manx dans le forum SL & STL
    Réponses: 10
    Dernier message: 29/11/2007, 20h06
  2. std::vector, taille du vecteur-> quel fonction
    Par toutounesan dans le forum C++
    Réponses: 3
    Dernier message: 11/09/2007, 15h43
  3. Form bloquée et fonction qui boucle
    Par bgcode dans le forum VB.NET
    Réponses: 2
    Dernier message: 28/08/2007, 13h21
  4. Quels fonctions pour ces opérations sur le réseau ?
    Par Pierre.g dans le forum Windows
    Réponses: 4
    Dernier message: 13/01/2007, 12h49
  5. Réponses: 4
    Dernier message: 11/11/2006, 02h11

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