Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2682 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2233438
soad029
Posté le 16-07-2014 à 10:34:04  profilanswer
 

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

mood
Publicité
Posté le 16-07-2014 à 10:34:04  profilanswer
 

n°2233454
rufo
Pas me confondre avec Lycos!
Posté le 16-07-2014 à 15:13:08  profilanswer
 

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
n°2233467
soad029
Posté le 16-07-2014 à 18:07:25  profilanswer
 

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
n°2233497
rufo
Pas me confondre avec Lycos!
Posté le 17-07-2014 à 09:46:25  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 

Sujets relatifs
L'indice n'appartient pas à la sélection, VBA ExcelOracle - Requête SQL outer join
Cours ou tuto PL/SQL[Batch] selection d'une partie de chaine de caractère
[SGBD/SQL] MàJ Utilisation CASE et Auto Joincondition avec date
condition avec dateErreur install SQL 2008 R2
[VB6] Problème de lien d'une base SQL Server vers AccessSQL et les Update multi lignes
Plus de sujets relatifs à : SQL | Sélection sur le max d'une date


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR