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

SQL Oracle Discussion :

[8i]Select particulier GROUP BY/MAX


Sujet :

SQL Oracle

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut [8i]Select particulier GROUP BY/MAX
    Bonjour,
    voila pas mal de temps que je butte sur une requête qui me parait pourtant relativement simple...
    J'ai 3 tables : OBJET, LIVRAISON, et celle qui fait la jointure entre les 2 OBJET_LIVRAISON.

    Je voudrais récupérer, pour tous les objets de OBJET, la dernière livraison correspondante(par rapport au champ "DATE" de la livraison).
    Ce qui répondrait à ma requete, et qui ne marche bien entendu pas, serait quelque chose dans ce gout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select OBJET.ID_OBJET, LIVRAISON.ID_LIVRAISON
    from OBJET, LIVRAISON, OBJET_LIVRAISON
    where OBJET.ID_OBJET = OBJET_LIVRAISON.ID_OBJET
    and LIVRAISON.id_livraison = OBJET_LIVRAISON.id_livraison
    group by OBJET.ID_OBJET, LIVRAISON.ID_LIVRAISON
    HAVING MAX("DATE") = LIVRAISON."DATE"
    Voila, la réponse doit être évidente mais je ne la vois pas...
    Cartes Pokémon, Yugioh, Magic ?
    Communauté d'échange

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT OBJET.ID_OBJET, LIVRAISON.ID_LIVRAISON,MAX(LIVRAISON."DATE")
    FROM OBJET, LIVRAISON, OBJET_LIVRAISON
    WHERE OBJET.ID_OBJET = OBJET_LIVRAISON.ID_OBJET
    AND LIVRAISON.id_livraison = OBJET_LIVRAISON.id_livraison
    GROUP BY OBJET.ID_OBJET, LIVRAISON.ID_LIVRAISON

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Merci de ta réponse, mais c'est pas encore tout à fait ca. Le problème c'est que je n'ai pas LA dernière livraison avec cette requete.
    En fait ce que je peux avoir avec ta requete est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ID_OBJET     ID_LIVRAISON      MAX(DATE)
    12                      1                20/10/2006 15:31:39
    12                      2                13/11/2006 17:45:47
    Or je voudrais seulement avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ID_OBJET     ID_LIVRAISON      MAX(DATE)
    12                      2                13/11/2006 17:45:47
    Car la derniere livraison pour l'objet '12' est la 2eme, ce que l'on sait grace à la date(a la limite j'ai pas besoin de récupérer la date apres..)
    Enfin je pense il doit pas falloir changer grand chose mais décidément...
    Cartes Pokémon, Yugioh, Magic ?
    Communauté d'échange

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    t'as le droit de réfléchir aussi hein

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT OBJET.ID_OBJET, MAX(LIVRAISON.ID_LIVRAISON),MAX(LIVRAISON."DATE")
    FROM OBJET, LIVRAISON, OBJET_LIVRAISON
    WHERE OBJET.ID_OBJET = OBJET_LIVRAISON.ID_OBJET
    AND LIVRAISON.id_livraison = OBJET_LIVRAISON.id_livraison
    GROUP BY OBJET.ID_OBJET

  5. #5
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926

  6. #6
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Oui je sais bien, mais si j'ai posté c'est parce que je ne trouve pas de solution... je cherche depuis hier, mais je dois aborder le problème par le mauvais coté.
    Bon tu vas croire que je le fais expres, mais ce n'est toujours pas bon..

    J'ai pensé à cette méthode, mais c'est pour cela que j'ai précisé dans mon 1er post que je devais utiliser la date de livraison pour savoir quelle est la dernière livraison, au cas où il y ait une insertion de livraison retardé pour je ne sais quelle raison. Le champ date est plus sur

    Donc c'est pour ca je ne vois pas comment facilement récupérer l'id de la livraison correspondant au max de la date... En tout cas merci de ton aide.
    Cartes Pokémon, Yugioh, Magic ?
    Communauté d'échange

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    donne nous les scripts de création des tables et des lignes exemples pour qu'on puisse essayer STP.

    Laurent pas de fonction analytique avant la 9i

  8. #8
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par kangaxx Voir le message
    Bon tu vas croire que je le fais expres, mais ce n'est toujours pas bon..
    voila qui m'aide énormément pour savoir ce qui ne va pas

  9. #9
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Ok, donc voici les 3 tables :
    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
    create table OBJET
    (
      ID_OBJET number
    )
    ;
     
    create table LIVRAISON
    (
      ID_LIVRAISON number,
      "DATE" date
    )
    ;
     
    create table OBJET_LIVRAISON
    (
      ID_OBJET number,
      ID_LIVRAISON number
    )
    ;
    Et les données, si j'ai les objets 1 et 2. Par ex
    la livraison 1 livre l'objet 1 et 2 le 27-02-2006
    la livraison 2 livre ce meme objet 1 le 12-06-2006
    la livraison 3 livre toujours ce meme objet 1 le 10-03-2006

    je voudrais avoir comme résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ID_OBJET    ID_LIVRAISON
    1               2
    2               1
    voila qui m'aide énormément pour savoir ce qui ne va pas
    L'explication était juste après... le problème est que tu détermine la dernière livraison avec son numéro, et j'ai précisé que je voulais le faire à partir de la date pour plus de sureté.

    J'espère que mes propos sont un peu plus clairs, mais s'il reste des zones d'ombre je suis toujours la.
    Cartes Pokémon, Yugioh, Magic ?
    Communauté d'échange

  10. #10
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Et ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT OBJET.ID_OBJET, LIVRAISON.ID_LIVRAISON
    FROM OBJET, LIVRAISON, OBJET_LIVRAISON
    WHERE OBJET.ID_OBJET = OBJET_LIVRAISON.ID_OBJET
    AND LIVRAISON.id_livraison = OBJET_LIVRAISON.id_livraison
    AND LIVRAISON.DATE = (select MAX(date) from LIVRAISON where id_livraison = OBJET_LIVRAISON.id_livraison);
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  11. #11
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Hélas plainer ca ne marche pas non plus, vu que je veux pour chaque objet une seule et unique installation correspondante : celle dont la date est la plus grande parmi toutes les livraisons ayant livré cet objet.
    Cartes Pokémon, Yugioh, Magic ?
    Communauté d'échange

  12. #12
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    et ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT ol.id_objet,
           l.id_livraison
    FROM livraison l,
        (SELECT ol.id_objet,
         MAX(l."DATE") "DATE"
       FROM livraison l,
            objet_livraison ol
       WHERE l.id_livraison = ol.id_livraison
       GROUP BY ol.id_objet) ol
    WHERE ol."DATE" = l."DATE"
    Faut pas que 2 livraisons aient la même date par contre

  13. #13
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Oui le résultat est bon ora, par contre effectivement si 2 livraisons ont la même date, les résultats vont devenir incohérents... Normalement ca ne devrait pas arriver, vu que la date a une précision à la seconde près, mais je ne peux pas prendre le risque.
    La solution "parfaite" serait de pouvoir récupérer directement le id_livraison correspondant à la max date dans la sous requete, mais pas possible...

    Encore merci de m'aider à trouver une solution.
    Cartes Pokémon, Yugioh, Magic ?
    Communauté d'échange

  14. #14
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par kangaxx Voir le message
    La solution "parfaite" serait de pouvoir récupérer directement le id_livraison correspondant à la max date dans la sous requete, mais pas possible...
    la solution parfaite ce serait surtout un numéro d'ordre... parce qu'une sous-requête est possible mais t'aura le même problème si les dates sont égales

    Le modéle ne m'a pas l'air au top

  15. #15
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Laurent pas de fonction analytique avant la 9i
    1) keep n'est pas une fonction analytique
    2) fonctions analytiques en 8i

    Bon, disons qui si keep n'existe pas, tu peux toujours employer DENSE_RANK

  16. #16
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    un exemple tout prêt sorti de la doc 8i avec RANK

    TOP_N
    http://download-west.oracle.com/docs...ysis.htm#22773

  17. #17
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    alors là ça me scie... j'étais persuadé que c'était nouveau

  18. #18
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Merci laurent, en modifiant l'exemple que tu m'as passé ca m'a l'air tout bon. Enfin ca me rassure un peu quant au fait que je n'arrivais pas à trouver la solution.. ^^

    Voila la solution finale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT id_objet, id_livraison FROM (SELECT id_objet, l.id_livraison, RANK() OVER(PARTITION BY 
    id_objet ORDER BY "DATE" DESC) AS rank1
    FROM livraison l,
            objet_livraison ol
       WHERE l.id_livraison = ol.id_livraison
    GROUP BY id_objet, l.id_livraison, "DATE")
    WHERE rank1 <= 1;
    Sinon ora, cette partie la de la base de données a été fixé, et les livraisons n'ont pas de "numéro", même si on pourrait récupérer un pseudo numéro à partir du nom de la livraison, je préférais éviter.

    Edit : encore merci à vous deux, et pour votre rapidité
    Cartes Pokémon, Yugioh, Magic ?
    Communauté d'échange

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

Discussions similaires

  1. Select sum(Poids) sur max(date) group by adr
    Par olibara dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/04/2009, 18h12
  2. Selection de la valeur max et d'un nom associé
    Par djefff75 dans le forum Access
    Réponses: 7
    Dernier message: 24/02/2006, 11h21
  3. selection avec group by mais ne garder que ...
    Par Larson dans le forum Langage SQL
    Réponses: 13
    Dernier message: 22/06/2005, 17h23
  4. Select particulier .
    Par hamed dans le forum Langage SQL
    Réponses: 9
    Dernier message: 17/11/2003, 15h45
  5. Selection de Groupes ki ne sont pas sous groupes...
    Par superdada dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/07/2003, 14h42

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