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 :

SQL | Sélection sur le max d'une date


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 70
    Points
    70
    Par défaut SQL | Sélection sur le max d'une date
    Bonjour tout le monde,

    J'ai fait une requête qui m'affiche les lignes que je cherche mais il me reste un dernier critère de sélection, et celui-ci est plus complexe à obtenir.

    Pour l'instant, la requête me génère 14 lignes dont le sujet est pfo_idRattachement.

    Chaque pfo_idRattachement se trouve dans la table principale tp_rti, voici l'exemple de lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    rti_idrattachement ; rti_DateorigineFlux ; rti_actionGlobale_init
    xxxx ; 20140701 ; 4
    xxxx ; 20140702 ; 2
    ...
    Je voudrais que ce idRattachement ne fasse PAS partie de mes 14 résultats actuels, car le dernier enregistrement (max(dateorigineFlux)) est différent de 4.

    Pour l'instant j'ai fait ceci mais ça ne me semble pas bon :

    Requête qui fonctionne mais ne prend pas en compte mon dernier critère de sélection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select * from bps_bpai.TB_OAI_PAR OAI, bps_bpai.TB_PFO PFO
    where OAI.pfo_id = PFO.pfo_id
    and oar_etat = 2
    and pfo_idrattachement in (
        select distinct(rti.rti_idrattachement) from BPS_PRV.tp_rti rti, BPS_PRV.tp_app app --, tp_sicom com --140992 cas
        where rti.app_id = app.app_id
        --and app.sic_id = com.sic_id
        and app.app_codeapplication = 'ADMINBPS'
        and rti.rti_actionglobale_init = 4
     
    );
    Avec le critère en plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    and pfo_idrattachement not in (
            select R.rti_idrattachement
            from tp_rti R
            INNER JOIN 
            (
              select rti_idrattachement, max(rti_dateorigineflux) AS DateMax  FROM tp_rti where rti_actionglobale_init <> 4 
              group by rti_idrattachement
            ) temp on R.rti_idrattachement = temp.rti_idrattachement
            where R.rti_dateorigineflux = temp.DateMax
    )
    Savez-vous comment je pourrais l'implémenter et par ailleurs de façon optimisée, car ma requête prend déjà pas mal de temps.

    Si vous voyez des optimisations dans ma requête actuelle, je suis preneuse également.

    D'avance merci pour votre aide

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Bonjour,

    Vous souhaitez que idRattachement ne fasse pas partie des résultats.

    À la vue du code, je vois que vous avez écrit
    Or ce code sélectionne toutes les colonnes de la tables, il faudrait donc que vous énumériez à la place de l'étoile (*) toutes les colonnes que vous voulez voir !
    OS : LinuxMint 20

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Comme ceci ?

    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
     
    SELECT 
    		* 
    FROM		bps_bpai.TB_OAI_PAR OAI
    INNER JOIN	bps_bpai.TB_PFO PFO
    	ON			OAI.pfo_id = PFO.pfo_id
    WHERE oar_etat = 2
    AND pfo_idrattachement IN (
        SELECT	rti.rti_idrattachement
        FROM	BPS_PRV.tp_rti rti
        INNER JOIN BPS_PRV.tp_app app 
    		ON		rti.app_id = app.app_id
        LEFT JOIN BPS_PRV.tp_rti suivant
    		ON	suivant.rti_idrattachement = rti.rti_idrattachement 
    		AND suivant.rti_DateorigineFlux > rti.rti_DateorigineFlux 
        AND app.app_codeapplication = 'ADMINBPS'
        AND rti.rti_actionglobale_init = 4
        AND suivant.rti_idrattachement IS NULL
    );
    Edit : concernant l'optimisation, sans connaitre au moins votre sgbd, la structure de vos tables et vos index, ça va être difficile.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 70
    Points
    70
    Par défaut
    Merci pour vos réponses !

    Pour l'instant les colonnes ce n'est pas très important, ce sont surtout les lignes obtenues qui me tracassent.

    J'ai essayé votre requête aieeeuuuu. Un grand merci pour le temps consacré. Elle me génère par contre plusieurs milliers de lignes alors qu'elle devrait m'en sortir que 8. Je vais regarder pourquoi, si vous avez une idée je suis preneuse.

    Sinon dans mon exemple, je n'ai mis que 2 lignes pour un idRattachement, mais il peut y en avoir beaucoup plus. Il me faut juste la plus récente et si elle a l'actionGlobale_init différent de 4, je ne la prends pas dans mes résultats (ou inversement, si actionGlobale_Init = 4 alors elle vient dans mes résultats).

    Merci encore

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Là encore, difficile à dire sans connaître la structure des tables.

    Dans ma requête, j'ai en effet commis une erreur de copier-coller. La requête devrait être
    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
    20
     
     
    SELECT 
    		* 
    FROM		bps_bpai.TB_OAI_PAR OAI
    INNER JOIN	bps_bpai.TB_PFO PFO
    	ON			OAI.pfo_id = PFO.pfo_id
    WHERE oar_etat = 2
    AND pfo_idrattachement IN (
        SELECT	rti.rti_idrattachement
        FROM	BPS_PRV.tp_rti rti
        INNER JOIN BPS_PRV.tp_app app 
    		ON		rti.app_id = app.app_id
        LEFT JOIN BPS_PRV.tp_rti suivant
    		ON	suivant.rti_idrattachement = rti.rti_idrattachement 
    		AND suivant.rti_DateorigineFlux > rti.rti_DateorigineFlux 
        WHERE app.app_codeapplication = 'ADMINBPS'
        AND rti.rti_actionglobale_init = 4
        AND suivant.rti_idrattachement IS NULL
    );
    Est-ce mieux ainsi ?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 70
    Points
    70
    Par défaut
    C'est parfait !! J'ai tous les résultats attendus !!

    Elle prend 8,7 minutes pour se jouer, ce qui est court je trouve car rien que ma requête qui n'était pas terminée prenait 9,4 minutes.

    Ceci-dit, j'aimerais beaucoup l'optimiser encore, car elle sera utilisée dans un script, mais je ne suis pas sûre que cela soit possible, car les champs indexés ne sont pas utilisables dans notre requête et ce que vous avez produit me parait le plus optimisé (je suis sous Oracle 11g pour info).

    Si vous voyez néanmoins une optimisation à faire, je suis preneuse.

    En tout cas un grand merci pour votre aide !!

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Ne pouvez-vous pas créer d'index ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 127
    Points : 70
    Points
    70
    Par défaut
    Non je ne peux point.
    Mais ce n'est pas si grave au finale, comme le script devra se jouer, j'ai rajouté une condition sur la date (where date > hier) et du coup mon temps de traitement est passé à 2 minutes, ce qui est correct.

    En tout cas la requête est TOP !

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

Discussions similaires

  1. Encore un problème sur le format d'une date!
    Par bygui dans le forum Langage
    Réponses: 1
    Dernier message: 26/06/2006, 08h41
  2. [oracle 9i] Max d'une date
    Par Requin15 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 09/06/2006, 15h09
  3. [hibernate HQL] Sélection de l'année d'une date
    Par Fr@ncky dans le forum Hibernate
    Réponses: 2
    Dernier message: 24/01/2006, 12h53
  4. Réponses: 2
    Dernier message: 16/08/2005, 15h33
  5. requête sur l'année d'une date
    Par jo77 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/07/2003, 09h28

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