Bonjour à tous,
J'ai deux dt et je veux créer une nouvelle colonne dans le dt principal en fonction des données du dt secondaire.
Je souhaite une commande JSL qui vérifie la date dans la colonne "dt1" et qui correspond au numéro de groupe de "dt2" en fonction de la date de début et de la date de fin (Plage de temps)
dt1: (primaire)
| rendez-vous amoureux | Groupe |
| 17/05/2019 13:06 | |
| 17/05/2019 13:06 | |
| 23/05/2019 10:02 | |
| 24/05/2019 13:47 | |
dt2: (secondaire)
| Groupe | date de début | date de fin |
| 1 | 17/05/2019 20:15 | 18/05/2019 8:14 |
| 2 | 18/05/2019 8:15 | 18/05/2019 20:14 |
| 1 | 18/05/2019 20:15 | 19/05/2019 8:14 |
| 3 | 19/05/2019 8:15 | 19/05/2019 20:14 |
| 2 | 19/05/2019 20:15 | 20/05/2019 8:14 |
| 3 | 20/05/2019 8:15 | 20/05/2019 20:14 |
| 2 | 20/05/2019 20:15 | 21/05/2019 8:14 |
| 4 | 21/05/2019 8:15 | 21/05/2019 20:14 |
| 3 | 21/05/2019 20:15 | 22/05/2019 8:14 |
| 4 | 22/05/2019 8:15 | 22/05/2019 20:14 |
| 3 | 22/05/2019 20:15 | 23/05/2019 8:14 |
| 1 | 23/05/2019 8:15 | 23/05/2019 20:14 |
| 4 | 23/05/2019 20:15 | 24/05/2019 8:14 |
| 1 | 24/05/2019 8:15 | 24/05/2019 20:14 |
Votre aide sera très appréciée.
salut @ileshem ,
Il y a plusieurs façons de procéder. Une solution consiste à créer un tableau répertoriant les groupes pour chaque heure comprise entre la date de début et la date de fin. Vous pouvez ensuite utiliser ce tableau avec Tableaux> Mettre à jour pour importer le numéro du groupe en faisant correspondre directement le nouveau groupe de date qui couvre. le début et la fin. Cela impliquerait la création de cette nouvelle table étendue et, en fonction du nombre de plages de dates que vous avez, cette table pourrait devenir assez volumineuse.
Une autre option (que je préfère dans ce cas-ci) consiste à utiliser le générateur Tables> JMP Query Builder, ce qui nous permettra d’établir une jointure pouvant utiliser une logique SQL pour faire correspondre une date à la fois après la date de début mais avant la date de fin. Vous pouvez concevoir cette requête de manière interactive, ce qui est l'une des raisons pour lesquelles j'aime cette approche. Par conséquent, si vous ne souhaitez pas créer de script, vous pouvez tout faire à l'aide de la souris. En enregistrant le script, on obtient un fichier jsl qui n’est pas trop difficile à généraliser. Il suffit de quelques astuces pour obtenir simplement les noms de table sans extension et pour insérer les noms de table à l’aide de evalInsert (). Un peu étrange, et d'autres pourraient avoir un moyen plus élégant de faire ce que j'ai fait ici. Cela dit, il est possible de ne pas écrire de JSL personnalisé pour aller ligne par ligne dans une table pour effectuer la recherche dans une autre (ce qui constitue également une troisième approche tout à fait acceptable).
Voici le code pour JMP Query Builder, et j'ai joint vos exemples de tables pour essayer ceci. Si vous souhaitez savoir comment configurer cela de manière interactive, faites-le-moi savoir - cela prend 30 secondes pour le construire à partir de zéro.
dt1 = Data Table( "primary.jmp" );
dt2 = Data Table( "secondary.jmp" );
dt1NameOnly = Left( dt1 << getname, Length( dt1 << getname ) - 4 );
dt2NameOnly = Left( dt2 << getname, Length( dt2 << getname ) - 4 );
New SQL Query(
Version( 130 ),
Connection( "JMP" ),
JMP Tables( Eval Insert( "\[ [dt1<<GETNAME> "_MEMORY_", dt2<<GETNAME> "_MEMORY_"] ]\" ) ),
QueryName( "SQLQuery1" ),
Select( Column( "date", "t1", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) ), Column( "Group 2", "t2" ) ),
From(
Table( dt1NameOnly, Alias( "t1" ) ),
Table(
dt2NameOnly,
Alias( "t2" ),
Join(
Type( Left Outer ),
GE(
Column( "date", "t1", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) ),
Column( "Start Date", "t2", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) )
) & LE(
Column( "date", "t1", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) ),
Column( "End Date", "t2", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) )
)
)
)
)
) << Run;
</GETNAME></GETNAME>Re-bonjour, @ileshem ,
J'ai mentionné que vous pouviez résoudre ce problème avec jsl personnalisé et que vous souhaitiez partager cette méthode avec quelques boucles For () qui fonctionnent ligne par ligne dans votre table primaire pour trouver une date correspondant à vos critères dans la table secondaire. Il existe des moyens de le faire plus efficacement pour les très grandes applications, mais c'est un début.
dt1 = Data Table( "primary.jmp" );
dt2 = Data Table( "secondary.jmp" );
For( i = 1, i <= N Row( dt1 ), i++,
For( j = 1, j <= N Row( dt2 ), j++,
If( And( dt1:date[i] >= dt2:Start Date[j], dt1:date[i] <= dt2:End Date[j] ),
dt1:Group[i] = dt2:Group[j];
Break();
)
)
);
@julien