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 :

Problème avec MAX


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 37
    Points : 33
    Points
    33
    Par défaut Problème avec MAX
    bonjour, j'utilise une base de type sql server

    voici un extrait de ma base

    gde_gui_id gde_doc_id gde_eta_id gde_dat_upd
    95 1 1 2012-05-27 01:36:20.930
    95 1 3 2012-06-28 00:00:00.000
    95 2 1 2012-04-27 01:36:20.930
    95 2 2 2012-05-27 01:36:20.930

    gde_gui_id et gde_doc_id sont la clé primaire
    gde_dat_upd est la date de maj

    mon souhait : pour chaque couple gde_gui_id + gde_doc_id, je dosi afficher la ligne dont gde_dat_upd est le MAX

    je dois récupérer les 2 lignes suivantes

    gde_gui_id gde_doc_id gde_eta_id gde_dat_upd
    95 1 3 2012-06-28 00:00:00.000
    95 2 2 2012-05-27 01:36:20.930

    j'ai testé divers requête MAX, GROUP BY... et je me retrouve avec une seul ligne :
    95 1 3 2012-06-28 00:00:00.000

    pouvez-vous me proposer une requête s'il vous plaît?

    merci d'avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT gde_gui_id, gde_doc_id, gde_dat_upd
    FROM         guides_documents_etats
    WHERE gde_gui_id = 95
    AND gde_dat_upd = (SELECT MAX(gde_dat_upd) FROM guides_documents_etats as gde WHERE gde.gde_gui_id = gde_gui_id AND gde.gde_doc_id = gde_doc_id)
    group by gde_gui_id, gde_doc_id, gde_dat_upd

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 37
    Points : 33
    Points
    33
    Par défaut
    petite avancée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT gde_gui_id, gde_doc_id, MAX(gde_dat_upd) gde_dat_upd
    FROM         guides_documents_etats
    WHERE gde_gui_id = 95
    group by gde_gui_id, gde_doc_id
    ça retourne ça

    95 1 2012-06-28 00:00:00.000
    95 2 2012-05-27 01:36:20.930

    mais si je veux afficher les autres champ de ma table je reviens au point mort

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT gde_gui_id, gde_doc_id, MAX(gde_dat_upd) gde_dat_upd, doc_lib, doc_rol_id, gde_eta_id, gde_dat_val, gde_rot, gde_srv, gde_rep, gde_uti_id, gde_gui_id
    FROM         guides_documents_etats INNER JOIN
                          documents ON guides_documents_etats.gde_doc_id = documents.doc_id
    WHERE     (guides_documents_etats.gde_gui_id = 95)
    group by gde_gui_id, gde_doc_id, gde_dat_upd, doc_lib, doc_rol_id, gde_eta_id, gde_dat_val, gde_rot, gde_srv, gde_rep, gde_uti_id, gde_gui_id

    1 Carte d'identité 1 1 2012-05-27 01:36:20.930 2012-09-30 5 SERVEUR1 aaa\aaa\aaa 2 95
    1 Carte d'identité 1 3 2012-06-28 00:00:00.000 2012-07-15 7 SERVEUR2 bbb\bbb\bbb 2 95
    2 Carte de séjour 1 1 2012-04-27 01:36:20.930 2012-07-15 7 SERVEUR2 bbb\bbb\bbb 2 95
    2 Carte de séjour 1 2 2012-05-27 01:36:20.930 2012-07-15 7 SERVEUR2 bbb\bbb\bbb 2 95

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 770
    Points : 52 723
    Points
    52 723
    Billets dans le blog
    5
    Par défaut
    Respectez la charte de postage et donnez nous au moins le DDL de vos tables. En effet, la solution à ce genre de problème passe par la connaissance de la clef primaire de votre table.

    http://www.developpez.net/forums/a69...gage-sql-lire/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Tu es sur le bon chemin.
    Il faut faire une jointure entre la première requête de "petite avancée" avec la table pour récupérer les autres informations.
    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
    SELECT e.gde_gui_id, e.gde_doc_id, e.gde_dat_upd,
    	d.doc_lib, d.doc_rol_id,
    	e.gde_eta_id, e.gde_dat_val, e.gde_rot, e.gde_srv, e.gde_rep, e.gde_uti_id
    FROM guides_documents_etats e
    INNER JOIN
    (
    	SELECT gde_gui_id, gde_doc_id, 
    		MAX(gde_dat_upd) gde_dat_upd
    	FROM guides_documents_etats
    	WHERE gde_gui_id = 95
    	GROUP BY gde_gui_id, gde_doc_id
    ) tmp 
    	ON tmp.gde_gui_id = e.gde_gui_id
    	AND tmp.gde_doc_id = e.gde_doc_id
    	AND tmp.gde_dat_upd = e.gde_dat_upd
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 37
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Tu es sur le bon chemin.
    Il faut faire une jointure entre la première requête de "petite avancée" avec la table pour récupérer les autres informations.
    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
    SELECT e.gde_gui_id, e.gde_doc_id, e.gde_dat_upd,
    	d.doc_lib, d.doc_rol_id,
    	e.gde_eta_id, e.gde_dat_val, e.gde_rot, e.gde_srv, e.gde_rep, e.gde_uti_id
    FROM guides_documents_etats e
    INNER JOIN
    (
    	SELECT gde_gui_id, gde_doc_id, 
    		MAX(gde_dat_upd) gde_dat_upd
    	FROM guides_documents_etats
    	WHERE gde_gui_id = 95
    	GROUP BY gde_gui_id, gde_doc_id
    ) tmp 
    	ON tmp.gde_gui_id = e.gde_gui_id
    	AND tmp.gde_doc_id = e.gde_doc_id
    	AND tmp.gde_dat_upd = e.gde_dat_upd

    Excellente réponse !!!

    Pour compléter la requête car les champs d.doc_lib, d.doc_rol_id font planter la requête j'ai rajouté la jointure qui complète le tout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT gde.gde_gui_id, gde.gde_doc_id, gde.gde_dat_upd, doc_lib, doc_rol_id, gde_eta_id, gde_dat_val, gde_rot, gde_srv, gde_rep, gde_uti_id 
    FROM         guides_documents_etats gde INNER JOIN documents ON gde_doc_id = documents.doc_id
    INNER JOIN
    (
    SELECT gde_gui_id, gde_doc_id, 
    		MAX(gde_dat_upd) gde_dat_upd
    	FROM guides_documents_etats
    	WHERE gde_gui_id = 95
    	GROUP BY gde_gui_id, gde_doc_id
    ) tmp
    ON tmp.gde_gui_id = gde.gde_gui_id
    	AND tmp.gde_doc_id = gde.gde_doc_id
    	AND tmp.gde_dat_upd = gde.gde_dat_upd
    En analysant ta requête j'en conclus que quand on a affaire à une situation telle que la mienne, il faut :

    1/ Faire la requête simple : MAX + GROUP BY avec le strict nécessaire
    2/ Faire la requête principale avec les champs à afficher + jointure
    3/ Faire la jointure entre 1/ et 2/

    Merci beaucoup! ^^

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Effectivement, j'avais oublié une jointure.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

Discussions similaires

  1. Problème avec "MAX"
    Par guivrator dans le forum Requêtes
    Réponses: 5
    Dernier message: 16/04/2009, 14h25
  2. Problème avec "MAX" et/ou "TOP"
    Par funkyjul dans le forum Développement
    Réponses: 6
    Dernier message: 18/03/2009, 07h54
  3. problème avec MAX(Date)
    Par ouchemhou dans le forum Langage SQL
    Réponses: 12
    Dernier message: 23/08/2008, 17h13
  4. Problème avec MAX()
    Par Arkay dans le forum Requêtes
    Réponses: 5
    Dernier message: 10/10/2007, 20h01
  5. Problème avec Max.
    Par Tyler Durden dans le forum Langage SQL
    Réponses: 3
    Dernier message: 19/10/2006, 08h05

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