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

DB2 Discussion :

MAX Multiple en SQL DB2


Sujet :

DB2

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Janvier 2003
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2003
    Messages : 339
    Par défaut MAX Multiple en SQL DB2
    Bonjour,

    Voici un nouveau problème que je rencontre. J'ai une table DB2 qui n'a aucune clé (ne me demandez pas pourquoi, faut que je fasse avec ...)

    Dedans, j'ai 3 Colonnes : NUM, DATE et TIMESTAMP (unique)

    Pour un NUM donné, j'ai plusieurs fois la même DATE à un TIMESTAMP différent mais également d'autres DATE antérieures

    Je souhaites récupérer pour ce NUM, celui dont la DATE est la plus récente - MAX(DATE) - mais également, pour cette date la plus récente, celui qui a le TIMESTAMP le plus récent - MAX(TIMESTAMP)

    Or, je ne vois pas comment utiliser la fonction MAX sur deux colonnes, même avec des requêtes imbriquées ...

    Merci pour votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,

    pour la sous requete il faut utiliser un group by : http://sqlpro.developpez.com/cours/sqlaz/ensembles/

    Ensuite vous pouvez joindre (http://sqlpro.developpez.com/cours/sqlaz/jointures/) cette sous-requete avec votre requête principale.

    Et refaire un group by pour trouver le timestamp max.


    Une autre solution consisterai à passer par une fonction de fenêtrage afin de faire une rupture / classement selon vos désirs http://sqlpro.developpez.com/article...clause-window/ (fonction row_number / partition by)

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Janvier 2003
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2003
    Messages : 339
    Par défaut
    Cela ne fonctionnera pas ? Si ma sous reqête retourne la DATE max pour un NUM, la jointure elle va bien retourner les deux enregistrement (même NUM/DATE)

    Je suis passé par un FETCH ROW 1 ONLY en triant sur le TIMESTAMP pour ne garder que le premier des doublons ...

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    d'où l'utilité d'un deuxième group by. (cf la 4eme ligne de mon message)

    Là vous avez fait à coup sur une requête scalaire, pas terrible si vous avez de la volumétrie.

  5. #5
    Invité de passage
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1
    Par défaut
    Bonjour,

    Si j'ai bien compris le problème, une requête de ce type devrait répondre à votre problème :

    select t1.num, t1.date, max(timestamp)
    from t_test2 as t1
    inner join
    (select num, max(date) as maxdate from t_test2
    group by num) t2
    on t1.num=t2.num and t1.date=t2.maxdate
    group by t1.num, t1.date
    order by t1.num

    Données exemple de la table t_test2 :

    NUM DATE TIMESTAMP
    1 03/09/12 2012-09-05-17.02.10.863290
    1 04/09/12 2012-09-05-17.01.53.472888
    1 05/09/12 2012-09-05-17.01.01.903054
    1 05/09/12 2012-09-05-17.02.04.497027
    1 05/09/12 2012-09-05-17.02.06.591343
    2 03/09/12 2012-09-05-17.02.38.430884
    2 04/09/12 2012-09-05-17.02.42.353825
    2 04/09/12 2012-09-05-17.03.03.820583
    3 05/09/12 2012-09-05-17.02.50.014186
    3 05/09/12 2012-09-05-17.02.54.766432
    3 05/09/12 2012-09-05-17.02.57.582638
    3 05/09/12 2012-09-05-17.02.58.909715

    Données résultat de la requête :

    NUM DATE MAX ( TIMESTAMP )
    1 05/09/12 2012-09-05-17.02.06.591343
    2 04/09/12 2012-09-05-17.03.03.820583
    3 05/09/12 2012-09-05-17.02.58.909715

Discussions similaires

  1. pb SQL DB2/400
    Par skywaukers dans le forum DB2
    Réponses: 4
    Dernier message: 01/07/2008, 19h09
  2. Connexions multiple sur base DB2 en serveur
    Par donnadieujulien dans le forum DB2
    Réponses: 2
    Dernier message: 13/06/2008, 11h53
  3. Jointures externes multiples en SQL ACCESS
    Par philnext dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/09/2007, 17h53
  4. alias multiples en SQL
    Par buzzkaido dans le forum Langage SQL
    Réponses: 3
    Dernier message: 03/05/2006, 10h41
  5. Réponses: 6
    Dernier message: 15/12/2005, 15h29

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