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

SQL | Sélection sur le max d'une date - SQL/NoSQL - Programmation

Marsh Posté le 16-07-2014 à 10:34:04    

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 :
  1. rti_idrattachement ; rti_DateorigineFlux ; rti_actionGlobale_init
  2. xxxx ; 20140701 ; 4
  3. xxxx ; 20140702 ; 2
  4. ...


Je voudrais que ce idRattachement ne fasse PAS partie de mes 14 résultats actuel 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 :
  1. select * from bps_bpai.TB_OAI_PAR OAI, bps_bpai.TB_PFO PFO
  2. where OAI.pfo_id = PFO.pfo_id
  3. and oar_etat = 2
  4. and pfo_idrattachement in (
  5.     select distinct(rti.rti_idrattachement) from BPS_PRV.tp_rti rti, BPS_PRV.tp_app app --, tp_sicom com --140992 cas
  6.     where rti.app_id = app.app_id
  7.     --and app.sic_id = com.sic_id
  8.     and app.app_codeapplication = 'ADMINBPS'
  9.     and rti.rti_actionglobale_init = 4
  10. );


 
Avec le critère en plus :
 

Code :
  1. and pfo_idrattachement not in (
  2.         select R.rti_idrattachement
  3.         from tp_rti R
  4.         INNER JOIN
  5.         (
  6.           select rti_idrattachement, max(rti_dateorigineflux) AS DateMax  FROM tp_rti where rti_actionglobale_init <> 4
  7.           group by rti_idrattachement
  8.         ) temp on R.rti_idrattachement = temp.rti_idrattachement
  9.         where R.rti_dateorigineflux = temp.DateMax
  10.     )


 
Savez-vous comment je pourrais l'implémenter et par ailleurs de façon optimisé, car ma requête prend déjà pas mal de temps.
 
Si vous voyez des optimisations dans ma requête actuelle je suis preneur également.
 
D'avance merci pour votre aide

Reply

Marsh Posté le 16-07-2014 à 10:34:04   

Reply

Marsh Posté le 16-07-2014 à 15:13:08    

Je te conseille de remplacer le not in par un LEFT JOIN et dans la clause having, mettre un is null sur le champ qui sert de jointure (le champ pfo_idrattachement apparemment) comme ça, ça te donnes les enregistrements qui se trouvent dans la table de gauche de la jointure mais qui ne se trouvent pas dans la table de droite. ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 16-07-2014 à 18:07:25    

Merci du conseil Rufo !
 
Voici ma requête qui marche maintenant :
 

Code :
  1. SELECT
  2.  *
  3. FROM  bps_bpai.TB_OAI_PAR OAI
  4. INNER JOIN bps_bpai.TB_PFO PFO
  5. ON   OAI.pfo_id = PFO.pfo_id
  6. WHERE oar_etat = 2
  7. AND pfo_idrattachement IN (
  8.     SELECT rti.rti_idrattachement
  9.     FROM BPS_PRV.tp_rti rti
  10.     INNER JOIN BPS_PRV.tp_app app
  11.  ON  rti.app_id = app.app_id
  12.     LEFT JOIN BPS_PRV.tp_rti suivant
  13.  ON suivant.rti_idrattachement = rti.rti_idrattachement
  14.  AND suivant.rti_DateorigineFlux > rti.rti_DateorigineFlux
  15.     WHERE app.app_codeapplication = 'ADMINBPS'
  16.     AND rti.rti_actionglobale_init = 4
  17.     AND suivant.rti_idrattachement IS NULL
  18. );


Message édité par soad029 le 16-07-2014 à 18:07:45
Reply

Marsh Posté le 17-07-2014 à 09:46:25    

De la même manière que j'indiquais qu'il fallait éviter les NOT IN, il faut aussi éviter les IN. Tu peux probablement le remplacer par une jointure. Sinon, tu prends la requête que t'as mise dans le IN et tu la place dans le FROM afin que son résultat soit vu comme une table et tu pourras alors faire la jointure. Un truc du genre

Code :
  1. ELECT
  2. *
  3. FROM  bps_bpai.TB_OAI_PAR OAI
  4. INNER JOIN bps_bpai.TB_PFO PFO
  5. ON   OAI.pfo_id = PFO.pfo_id,
  6. (
  7. SELECT rti.rti_idrattachement
  8.    FROM BPS_PRV.tp_rti rti
  9.    INNER JOIN BPS_PRV.tp_app app
  10. ON  rti.app_id = app.app_id
  11.    LEFT JOIN BPS_PRV.tp_rti suivant
  12. ON suivant.rti_idrattachement = rti.rti_idrattachement
  13. AND suivant.rti_DateorigineFlux > rti.rti_DateorigineFlux
  14.    WHERE app.app_codeapplication = 'ADMINBPS'
  15.    AND rti.rti_actionglobale_init = 4
  16.    AND suivant.rti_idrattachement IS NULL
  17. ) AS Tmp ON Tmp.rti_idrattachement = pfo_idrattachement
  18. WHERE oar_etat = 2


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed