[SQL] faire un distinct un peu plus évoluer ?

Bonjour à tous,

Je n'arrive pas à trouver la syntaxe SQL pour réaliser l'action suivante :

ma table MATABLE est de cette forme :
ID
DATE
ETAT

Je souhaiterais récupérer les derniers états (ETAT) de mes identifiants (ID) dans ma table MATABLE en ayant (pour les doublons) l'enregistrement ou le champ DATE est le plus vieux

Bien sûr le "select distinct(ID), ETAT from MATABLE" me retourne la liste de mes ID et ETAT (sans doublons), par contre, ce n'est pas forcémment le dernier état.
Configuration: Windows Vista
Internet Explorer 7.0

4 réponses

  1. bonjour,

    As-tu essayé de rajouter un "ORDER BY" sur la date dans ta requête ?
    0
    1. Merci pour ta réponse Aelith.

      Je souhaiterais récupérer les derniers états (ETAT) de mes identifiants (ID) dans ma table MATABLE en ayant (pour les doublons) l'enregistrement ou le champ DATE est le plus vieux

      Avec les valeurs suivantes par exemple :
      123 01/01/2008 OK
      456 04/01/2008 OK
      123 02/01/2008 OK
      456 01/01/2008 OK
      123 03/01/2008 PB

      Il faudrait que je récupère :
      123 03/01/2008 PB
      456 04/01/2008 OK

      l' "order by" va s'appliquer au distinct, mais pas au enregistrement unique, non?
      0
      1. Est-ce que "select distinct(ID), ETAT from MATABLE order by DATE desc" fonctionne ?

        sinon il faudrait peut-etre utiliser un group by ID...

        je jetterai un oeil ce midi, je n'ai rien pour tester sous la main pour l'instant
        0
    2. La requete que tu proposes ne retourne pas le résultat attendu (je l'avais aussi testée).

      ça retourne :
      456 OK
      123 PB
      123 OK

      au lieu de :
      456 OK
      123 PB
      0
      1. Après plusieurs essais, je pense avoir finalement trouvé ce que tu cherchais:

        select ID, ETAT, DATE from MATABLE where DATE in (select max(DATE) from MATABLE group by ID )

        (j'ignore cependant la réaction si deux enregistrements correspondent à la date la plus récente pour le même ID, je n'ai plus le temps de tester...)
        0
    3. je viens de lancer la requete, j'ai le retour suivant :

      456 04/01/2008 OK
      456 04/01/2008 OK
      123 03/01/2008 PB

      Donc, j'ai ajouter un distinct, et là j'ai bein :

      456 04/01/2008 OK
      123 03/01/2008 PB

      Avec le requete :
      select distinct(ID), ETAT, DATE from MATABLE where DATE in (select max(DATE) from MATABLE group by ID )

      Donc apparement ça me retourne un truc juste, je vais maintenant voir si avec de grosses tables, ça ne rame pas trop.
      Merci pour ton aide Aelith
      0