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 :

Filtrer les résultats avec un MAX et un GROUP BY ?


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Filtrer les résultats avec un MAX et un GROUP BY ?
    Hello

    Bon pour faire simple, j'ai une table du type

    ID_intervention
    ID_user
    CODE_intervention
    DATE_intervention

    et j'aimerais sortir uniquement la dernière intervention pour chaque ID_user

    j'ai donc tenté :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT
    	ID_intervention,
    	ID_user,
    	CODE_intervention,
    	MAX(DATE_intervention)
    FROM
    	matable
    GROUP BY
    	ID_intervention,
    	ID_user,
    	CODE_intervention
    Avec la dernière ligne en grisé la requête ne sort pas en erreur mais du coup il distingue les résultats différents par ID_intervention ET ID_user ET CODE_intervention, or moi j'aimerais les distinguer uniquement par ID_user.

    Dans le GROUP BY j'ai donc tenté de mettre uniquement ID_user mais la requête sort en erreur.

    Pour être plus clair voici un exemple...
    soit la table matable contenant ces enregistrements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ID_intervention	ID_user	CODE_intervention	DATE_intervention
    1		1	255			2012-08-05
    2		3	1603			2012-08-05
    3		1	8			2012-08-06
    4		3	1			2012-08-07
    5		3	-1			2012-08-08
    6		2	0			2012-08-08
    7		1	1			2012-08-08
    8		1	-1			2012-08-09
    9		1	0			2012-08-10
    Et j'aimerais afficher uniquement les enregistrements les plus récents pour chaue utilsateur, soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ID_intervention	ID_user	CODE_intervention	DATE_intervention
    5		3	-1			2012-08-08
    6		2	0			2012-08-08
    9		1	0			2012-08-10
    J'espère avoir été clair

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 283
    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 283
    Points : 12 982
    Points
    12 982
    Par défaut
    Bonjour,
    J'ai donné la réponse à une demande équivalente .

    Tatayo.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Je ne comprends pas la logique de ta requête, appliqué à mon cas ç me multiplie les resultats :'(

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 283
    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 283
    Points : 12 982
    Points
    12 982
    Par défaut
    La logique est la suivante: la dernière intervention, c'est celle pour laquelle il n'en existe pas d'autre à une date ultérieur, ici pour chaque id_user.
    Donc dans ton cas:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select i1.ID_intervention,
    	i1.ID_user,
    	i1.CODE_intervention,
    	i1.DATE_intervention
    from matable i1
    left outer join matable i2 on i2.id_user = i1.id_user and i2.date_intervention > i1.date_intervention
    where i2.id_user is null

    Tatayo.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Je bosse dessus depuis tout à l'heure, le résultat ressemble à ce que je recherche c'est déjà bon signe
    Mais pour une raison que j'ignore, il manque des enregistrements (des ID_users pourtant bien présents dans la table n'apparaissent pas alors qu'ils ont 1 ou plusieurs enregistrements dans cette table).

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Voici ma requête complète :
    Code SQL : 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
    19
    SELECT
       [user].[id] as [_UserID],
       [user].[Name],
       [intervention].[categoty],
       [intervention].[status],
       [intervention].[date]
     
    FROM
       [user]
    INNER JOIN [intervention]
       ON ([user].[id] = [intervention].[ID_user])
     
    LEFT OUTER JOIN [intervention] AS [subTable]
       ON ([subTable].[ID_user] = [intervention].[ID_user]
       AND subTable.date > intervention.date)
     
    WHERE
       [intervention].[categoty] = X
    AND subTable.ID_user IS NULL
    Ca me renvoie donc bien une seule intervention par utilisateur, la dernière, mais certains utilisateurs n'apparaissent pas dans le résultat, alors qu'ils ont bien des interventions..

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 283
    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 283
    Points : 12 982
    Points
    12 982
    Par défaut
    On peut avoir un exemple ?

    Tatayo.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 25
    Points : 33
    Points
    33
    Par défaut
    hello,

    J'étais sur le même problème depuis un nombre inavouable d'heures... Si j'applique ma solution à ton problème ca donne ca:

    Je voulais à partir d'une même table extraire la valeur la plus récente de chacun des couples que j'avais déterminé.
    Toi en l'occurence ce n'est pas un couple mais juste ID_utilisateur, mais ca reste la même chose.

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
     
    CREATE TABLE IF NOT EXISTS `T_inter` (
      `ID_intervention` smallint(6) NOT NULL auto_increment,
      `ID_user` smallint(6) NOT NULL ,
      `CODE_intervention` smallint(6) NOT NULL ,
      `DATE_intervention` date NOT NULL ,
      PRIMARY KEY  (`ID_intervention`)
    ) ;
     
     
     
    INSERT INTO `T_inter` (`ID_intervention`, `ID_user`, `CODE_intervention`, `DATE_intervention`) VALUES
    (1,1, 255, '2012-08-05'),
    (2,3, 1603, '2012-08-05'),
    (3,1, 8, '2012-08-06'),
    (4,3, 1, '2012-08-07'),
    (5,3, -1, '2012-08-08'),
    (6,2, 0, '2012-08-08'),
    (7,1, 1, '2012-08-08'),
    (8,1, -1, '2012-08-09'),
    (9,1, 0, '2012-08-10');
     
     
    SELECT p1.ID_intervention, p1.ID_user, p1.CODE_intervention, p1.DATE_intervention
    FROM t_inter p1 INNER JOIN ( SELECT ID_user, MAX(DATE_intervention) MAXDATE_intervention  FROM t_inter GROUP BY ID_user )  P2
    ON  p1.DATE_intervention = MAXDATE_intervention  and p1.ID_user =p2.ID_user;
    Est ce que ca répond au résultat attendu?
    Bien que tu aies surement trouvé depuis le 10/08

  9. #9
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Bonjour, solution simplifiée, SI ET SEULEMENT SI l'ID EST CHRONOLOGIQUE, et que la date est strictement chronologique (c'est à dire qu'une ligne de date supérieure est forcément d'id supérieure).

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select max(intervention_id), id_user
    from interventions
    group by id_user;

    Ainsi, vous avez l'id de la dernière intervention pour chaque user_id.
    Il suffit alors d'utiliser cette requête dans une sous-requête pour récupérer les informations de l'intervention en question.

    Ceci est plus juste que de se baser uniquement sur la date, car s'il peut y avoir plusieurs interventions à la même date (de type date et non datetime), on ne sait pas laquelle est la dernière.

Discussions similaires

  1. [Dojo] Filtrer les résultats d'un tableau avec FilteringSelect
    Par VinceCBA dans le forum Bibliothèques & Frameworks
    Réponses: 7
    Dernier message: 27/10/2011, 15h06
  2. Réponses: 7
    Dernier message: 08/07/2008, 20h41
  3. Réponses: 1
    Dernier message: 23/11/2007, 15h11
  4. Filtrer les messages avec Log4j
    Par devfd0 dans le forum Logging
    Réponses: 4
    Dernier message: 30/08/2007, 20h46
  5. Réponses: 1
    Dernier message: 13/04/2005, 15h41

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