Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bonjour à tous,
j'ai une problématique je n'arrive pas à résoudre :
- J'ai une table A qui contient les champs suivants ID | DT_VALEUR :
TabA :
LOAD * INLINE [
ID, DT_VALEUR
1, 01/01/2023
2, 12/02/2023
];
- Une table B qui contient les champs suivants ID | DT_DEB_VALEUR | DT_FIN_VALEUR
TabB :
LOAD * INLINE [
ID, DT_DEB_VALEUR, DT_FIN_VALEUR
1, 01/01/2019, 31/01/2022
1, 01/01/2023, 03/01/2023
1, 04/01/2023, 24/06/2023
2, 01/02/2020, 31/03/2023
2, 01/04/2023, 31/12/2024
];
Je souhaiterai créer une 3ème table (TabC par exemple) afin de conserver les éléments de TabA + ne ramener que les lignes de TabB lorsque la DT_VALEUR de TabA est comprise entre les valeurs DT_DEB_VALEUR et DT_FIN_VALEUR de la table B.
TabC :
NoConcatenate
LOAD *
Resident TabA ;
LEFT JOIN
NoConcatenate
LOAD *
Resident TabB
where DT_VALEUR <= DT_DEB_VALEUR
and DT_VALEUR >= DT_FIN_VALEUR ;
Sauf que cela me génère une erreur en me disant que le champ "DT_VALEUR" est introuvable (ce qui est effectivement logique puis qu'il n'existe pas dans TabB).
Merci par avance pour votre aide
Bonjour Briinou,
La solution passe par l'utilisation de la fonction IntervalMatch(), dont la syntaxe n'est pas des plus simple.
Je t'invite à regarder cet exemple de mise en oeuvre :
https://www.youtube.com/watch?v=oxQgqXT63gU
Cdlt
Bonjour Briinou,
La solution passe par l'utilisation de la fonction IntervalMatch(), dont la syntaxe n'est pas des plus simple.
Je t'invite à regarder cet exemple de mise en oeuvre :
https://www.youtube.com/watch?v=oxQgqXT63gU
Cdlt
Hello,
Effectivement, l'utilisation de IntervalMatch n'est pas très intuitive, mais la solution fonctionne et est très efficace sur le nombre de lignes que je traite !
Merci beaucoup pour la découverte de la fonction ! 😄
Le script de la solution :
TabA :
LOAD * INLINE [
ID, DT_VALEUR
1, 01/01/2023
2, 12/02/2023
];
TabB :
LOAD * INLINE [
ID, DT_DEB_VALEUR, DT_FIN_VALEUR, VALEUR1, VALEUR2
1, 01/01/2019, 31/01/2022, '01/01/19 > 31/01/22', 'Blabla'
1, 01/01/2023, 03/01/2023, '01/01/23 > 03/01/23',' Bloblo'
1, 04/01/2023, 24/06/2023, '01/01/23 > 03/01/23', 'Blublu'
2, 01/02/2020, 31/03/2023, '01/02/20 > 31/03/23', 'Abracadabra'
2, 01/04/2023, 31/12/2024, '01/04/23 > 31/12/24', 'Plouf'
];
IntervalMatch_TABLE :
IntervalMatch(DT_VALEUR, ID)
LOAD DT_DEB_VALEUR, DT_FIN_VALEUR, ID Resident TabB;
LEFT JOIN LOAD ID, DT_VALEUR Resident TabA;
LEFT JOIN LOAD ID, DT_DEB_VALEUR, DT_FIN_VALEUR, VALEUR1, VALEUR2 Resident TabB;
DROP TABLES TabA, TabB;
Merci 😉
Briinou,
Pour avoir un résultat propre, et si le fait d'avoir une seule table te convient il faut simplement supprimer la table B ( "drop table TabB;" à la fin du script)
Si par contre tu souhaites conserver 2 tables différentes ce script devrait t'aider :
LOAD * INLINE [
ID, DT_VALEUR
1, 01/01/2023
2, 12/02/2023
];
TabB :
LOAD * INLINE [
ID, DT_DEB_VALEUR, DT_FIN_VALEUR, VALEUR
1, 01/01/2019, 31/01/2022, '01/01/19 > 31/01/22'
1, 01/01/2023, 03/01/2023, '01/01/23 > 03/01/23'
1, 04/01/2023, 24/06/2023, '01/01/23 > 03/01/23'
2, 01/02/2020, 31/03/2023, '01/02/20 > 31/03/23'
2, 01/04/2023, 31/12/2024, '01/04/23 > 31/12/24'
];
TabC:
IntervalMatch(DT_VALEUR, ID)
LOAD DT_DEB_VALEUR
, DT_FIN_VALEUR
, ID
Resident TabB;
drop Table TabB;
Cdlt,
Hello,
Top ! Je venais de trouver la réponse de mon côté en même temps que ton retour.
C'est parfait, un grand merci 😉