Bonjour à tous,
Voilà, je bloque sur une requête que j'aimerai simplifier, mais je n'arrive pas à bien m'y prendre.
Est ce que vous pourriez m'aider ?
Voici la requete initiale.
Comme vous le voyez, on lit deux fois la table contract_versions
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SELECT * FROM contract_versions CV WHERE 1 = 1 AND CV.cv_crc_code NOT IN (12, 13, 14, 15, 16, 102) AND cv_number = (SELECT MAX (cv_number) FROM contract_versions WHERE NOT (cv_status_code = '09' OR cv_status_code = '9') AND cv_con_number = CV.cv_con_number)
et donc ce que je cherche à faire, c'est obtenir le même résultat en un seul passage.
Je suis sur que c'est faisable très facilement, mais j'arrive pas à m'en sortir avec les deux conditions :
D'un point de vue fonctionnel, ca donne cela
D'un coté, j'ai la liste des contrats valides : CV.cv_crc_code NOT IN (12, 13, 14, 15, 16, 102)
De l'autre, j'ai la liste des versions valides : NOT (cv_status_code = '09' OR cv_status_code = '9')
Et je cherche donc les infos (select *) pour la dernière version valide à laquelle le contrat est valide. (je ne ramène pas les contrats qui sont invalidés par leur dernière version)
->Un contract a pu par exemple ête invalidé par une version N, mais si cette version est justement invalidée elle aussi, alors le contrat reste valide.
Vous auriez une idée de comment je pourrais faire ca en évitant d'appeler deux fois la table ?
Pour info, l'idée sur laquelle je partais à la base était d'utiliser une fonction rank pour determiner ma ligne de version max.
Car après, j'ai besoin aussi des info de la version 1, donc le rank m'aurait permi d'avoir une condition du genre "rank = 1 (version max) OR version = 1"
Mais pour le moment, j'ai une couille dans le paté que j'arrive pas à enlever. C'est pas trop loin de ce que je cherche à faire, mais c'est toujours pas ça.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 select cv_con_number, cv_number, rank() over (partition by cv_con_number order by decode(cv_status_code, '09', 0, '9', 0, cv_number) desc), CV.* FROM contract_versions CV WHERE 1 = 1 AND CV.cv_crc_code NOT IN (12, 13, 14, 15, 16, 102)
Merci d'avance pour vos idées.
Steven
EDIT : Et je cherche donc les infos (select *) pour la dernière version valide à laquelle le contrat est valide. (je ne ramène pas les contrats qui sont invalidés par leur dernière version)
Je pense que c'est plus clair comme ca.
Partager