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 :

Select MAx ?


Sujet :

DB2

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Décembre 2002
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 1
    Par défaut Select MAx ?
    Bonjour,

    Je dois retrouver la première valeur d'une table qui contient plusieurs dates :

    Voici un exemple de la table

    Cle Date Valeur
    A 20050110 5
    A 20060220 6
    B 20060515 9
    C 20041020 3
    C 20051015 7

    Je dois retrouver
    Cle Date Valeur
    A 20060220 6
    B 20060515 9
    C 20051015 7


    J'ai essayé plusieures requêtes du style :

    Select t.cle, t.date, t.valeur
    from TBL t,
    table (select cle, MAX(date) from TBL group by cle, date) tmp
    where t.cle = tmp.cle and t.date = tmp.date

    Mais c'est fort lourd.
    Est-ce que vous avez une idée pour alléger la sauce ?

    Bien à vous
    Serge

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select cle, max(date), max(valeur) 
    from MaTable
    group by cle                                 
    order by cle
    Tout simplement !

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 56
    Par défaut
    Tout simplement !
    Attention, dans l'exemple ici , çà marche parce que le MAX(date) et le MAX(valeur) sont dans la même ligne (ex: A 20060220 6) et c'est le cas pour toutes les clés de l'exemple .
    Prennons les valeurs suivantes:

    A 20050110 9
    A 20060220 5
    A 20060220 4

    Le query donnera:

    A 20060220 9 -> mélange des lignes, ce n'est pas forcément ce que l'on recherche. le MAX(date) ne correspondant plus au MAX(valeur).

    Le query le plus approprié sera
    - si l'on considère que la date prime sur la valeur (soit la valeur maximum à la dernière date)

    Select a.cle, a.date, max(a.valeur)
    from matable a
    where a.date in (select max(b.date) from matable b
    where a.cle = b.cle)
    group by a.cle
    order by a.cle

    - si l'on considère que la valeur prime sur la date (soit la dernière date pour la valeur maximum):

    Select a.cle, max(a.date), a.valeur
    from matable a
    where a.valeur in (select max(b.valeur) from matable b
    where a.cle = b.cle)
    group by a.cle
    order by a.cle

    Evidement les performances du query seront différentes.

    .

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Par défaut
    ALHER,
    Delch a donné un échantillon de sa table où ne figure aucun doublon sur la colonne date ni sur la colonne valeur. Je suis parti du fait que, puisque c'est un échantillon, le cas des doublons dates et/ou valeurs devrait y figurer. Or, il n'y figure pas.
    Et même s'ils existent, la requête que tu proposes ne fonctionnerait pas. Il manque la date ou la valeur sur le group by et la requête ne fonctionne que dans le cas où plusieurs lignes existent pour une même clé avec dates et/ou valeurs différentes. Selon l'exemple que tu donnes, les lignes non doublonnées sur la clé ne figurent pas dans le résultat de tes requêtes. En reprenant les données ton exemple et en y ajoutant la date sur le group by :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Select a.cle, a.date, max(a.valeur)
    from matable a
    where a.date in (select max(b.date) from matable b
    where a.cle = b.cle)
    group by a.cle, a.date
    order by a.cle
    la requête ci-dessus n'affichera que la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CLE  DATE        MAX ( A . VALEUR ) 
     A   2006-02-20          5
    et la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CLE  DATE        VAL 
     A   2005-01-10    9
    sera perdue.

    J'attends la réaction de Delch pour savoir s'il y a lieu, comme tu le proposes, de distinguer une date et/ou une valeur particulière si doublons de dates et/ou valeurs sur la même clé.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 56
    Par défaut
    Il manque la date ou la valeur sur le group by
    Effectivement! j'ai oublié la date où la valeur dans le group by

    ce n'est pas forcément ce que l'on recherche
    Mercure, je voulais simplement attiré l'attention sur le mélange des lignes, et forcer la réflexion sur les données que l'on peux avoir et le résultat que l'on veux obtenir.

    Nous illustrons donc 3 cas:

    - une date maximun et un valeur maximum (indépendantes) pour une clé donnée.
    - une clé, une date maximum et la valeur maximum pour cette date.
    - une clé, la valeur maximum et la date maximum pour cette valeur

    A Delch de voir

Discussions similaires

  1. problème avec un select max
    Par bobic dans le forum Oracle
    Réponses: 7
    Dernier message: 14/11/2005, 11h22
  2. [SQL] requete select max
    Par kabikou dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 19/10/2005, 16h18
  3. Aide pour un SELECT MAX(...)
    Par Gladiator dans le forum Langage SQL
    Réponses: 7
    Dernier message: 24/06/2005, 16h48
  4. Incrémenter champ : insert into . select max(.) + 1 from .
    Par ludo.guy dans le forum Langage SQL
    Réponses: 10
    Dernier message: 25/11/2004, 14h39
  5. Problème select MAX(annee) dans une requête
    Par grisounette dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 28/10/2004, 17h36

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