Bienvenue dans la communauté.
Les instructions réelles qui sélectionneront des lignes dans une plage de dates donnée et créeront une nouvelle table de données avec uniquement ces lignes sélectionnées incluses.
// Select the row that have the date range desired
dt << select where( :Start Date >= informat("01/10/2025","m/d/y") &
:End Date <= informat("04/30/2025","m/d/y"));
// Create the new table
dtSubset = dt << subset( selected columns(0), selected rows(1), output table("theSubset"));
Voici un exemple complet qui crée d’abord un exemple de table de données, puis exécute les lignes ci-dessus pour sélectionner et créer la table de données.
(Remarque : l'exemple ci-dessous a été en quelque sorte omis de la publication originale. Merci à @jthi pour avoir signalé l'omission)
Names Default To Here( 1 );
// Create an Example data table
dt = New Table( "Example",
Add Rows( 20 ),
New Column( "Start Date",
Format( "m/d/Y" ),
set each value( Today() + In Days( Random Integer( 1, 100 ) ) )
),
New Column( "End Date",
Format( "m/d/Y" ),
set each value( :Start Date + In Days( Random Integer( 1, 50 ) ) )
)
);
// Select the row that have the date range desired
dt << select where(
:Start Date >= Informat( "01/10/2025", "m/d/y" ) & :End Date <=
Informat( "04/30/2025", "m/d/y" )
);
// Create the new table
dtSubset = dt << subset(
selected columns( 0 ),
selected rows( 1 ),
output table( "theSubset" )
);
Une autre façon intéressante et interactive de créer une nouvelle table consiste à utiliser un filtre de données. Le filtre de données permet à l'utilisateur de sélectionner de manière interactive des lignes dans la table de données et, une fois les lignes souhaitées sélectionnées, une nouvelle table peut être créée à partir de ces lignes.
Pour cela : Une fois le tableau de données affiché

Accédez au menu déroulant Lignes et sélectionnez « Filtre de données »

Dans la fenêtre Filtre de données, sélectionnez les dates de début et de fin, puis cliquez sur le signe +

Les filtres seront alors affichés.
Cliquez sur les cases à cocher Afficher et Inclure. Elles indiquent l'action à effectuer sur les lignes du tableau de données lorsque le paramètre des filtres sélectionne les lignes.

Les filtres peuvent maintenant être définis pour effectuer la sélection. Les lignes bleues peuvent être déplacées vers les dates de début et de fin souhaitées, ou les valeurs peuvent être saisies directement dans la zone de date affichée pour chaque filtre.
Veuillez noter comment les lignes du tableau de données sont sélectionnées lorsque les filtres sont modifiés

Une fois les lignes souhaitées sélectionnées, une nouvelle table de données peut être créée en sélectionnant la sélection Afficher le sous-ensemble dans la liste des actions du triangle rouge Filtre de données. Cliquez simplement sur le triangle rouge à côté du titre Filtre de données et sélectionnez l'option


Cela peut probablement être rendu beaucoup plus simple en gardant à l'esprit votre besoin final, mais comme il n'y a pas de colonne de spécifications/résultats exacte, je viens de créer quelque chose qui, je pense, devrait vous aider à avancer.
Names Default To Here(1);
dt = Open("$DOWNLOADS/example table.jmp");
Try(Column(dt, "Date 1") << Set Name("date_1"));
date_cols = Filter Each({colname}, dt << Get Column Names("String"),
Starts With(colname, "date_");
);
code_cols = Filter Each({colname}, dt << Get Column Names("String"),
Starts With(colname, "code ");
);
dt << New Column("Result", Character, Multiple Response);
For Each Row(dt,
dates = dt[Row(), date_cols];
between_bin = :"Start date"n <= dates <= :"Stop date"n;
between_idx = Loc(between_bin);
If(N Items(between_idx) > 0,
codes = dt[Row(), code_cols[between_idx]];
valid = Loc(codes);
If(N Items(valid) == 0,
codes = {};
,
codes = As List(codes[valid`]);
);
,
codes = {};
);
res = Transform Each({code}, codes,
Char(code);
);
:Result = Concat Items(res, ", ");
);

Le code de Jarmo est spectaculaire. J'aime voir comment il aborde et résout les problèmes. Mais, pendant la majeure partie de ma vie, mes collègues, mes amis, mon conjoint et mes enfants m'ont considéré comme quelqu'un d'étrange dans mes pensées. Les bons jours, on me qualifie de « Nerd ».
Étant donné mon statut dans la vie, j’ai découvert que la plupart des gens ne pensent pas comme moi.
@PruningTheSpark déclare
« Je pense que cela doit être une sorte de script car je ne peux pas penser à une formule qui fonctionnera. Je n'ai aucune expérience dans la création de scripts, donc toute aide serait appréciée !! ».
Je pense qu'une majorité d'utilisateurs de JMP se rapproche de la position de PruningTheSpark. PruningTheSpark ne pense peut-être pas qu'il existe une solution non scriptée au problème, mais les capacités interactives de JMP pour manipuler ses données sont vraiment puissantes. J'ai donc rassemblé ci-dessous les étapes interactives nécessaires pour résoudre le problème de PruningTheSparks.
En partant du tableau de données d'exemple fourni, je l'ai légèrement modifié. Compte tenu des résultats du script de Jamo, il montre qu'aucune des lignes n'a plus d'un code valide. Étant donné que plusieurs codes sont possibles, j'ai ajouté du code sur la ligne 2 qui s'afficherait pour que la ligne 2 ait plusieurs codes.

La première tâche consiste à rechercher tous les codes compris entre la date de début et la date de fin. Comme il existe 6 colonnes de codes différentes, le moyen le plus simple de le faire en une seule fois est d'empiler les données.
Tables=>Pile

Il s'agit d'une pile de séries multiples, jalonnant les colonnes de date et de code
Maintenant, je peux me débarrasser de tous les codes qui ont des valeurs manquantes car ils n'apparaîtront pas dans les résultats. J'ai donc sélectionné une cellule qui a une valeur manquante dans la colonne Données 2 qui contient tous les codes, puis j'ai fait un clic droit et j'ai choisi Sélectionner les cellules correspondantes

Qui sélectionne toutes les lignes qui ont des valeurs manquantes pour la colonne Données 2.
Faites un clic droit dans la colonne RowState et sélectionnez Supprimer les lignes

et il ne vous reste que les lignes qui ont des codes

Maintenant, je dois déterminer lesquels de ces codes se situent entre la date de début et la date de fin. Pour cela, je vais simplement créer une nouvelle colonne, que j'appellerai « entre », qui a une formule de

qui a un 1 pour les lignes où la colonne Données (elle contient la Date de la table d'origine) a un 1 pour être dans la plage et un 0 pour être en dehors de la plage

En utilisant la même technique que lors de la suppression des codes avec une valeur manquante, les lignes avec des zéros peuvent être sélectionnées et supprimées

Pour nettoyer le tableau, certaines des colonnes qui ne sont plus nécessaires peuvent être supprimées

La tâche consiste maintenant à ramener les codes dans des lignes simples. Pour ce faire, un simple fractionnement peut être effectué
Tables => Diviser


Pour combiner les colonnes de code en une seule colonne, vous pouvez utiliser un utilitaire de colonnes appelé Combine Columns. Sélectionnez simplement les colonnes à combiner, puis
Cols=>Utilitaire=>Combiner les colonnes

Cela fait apparaître une zone de saisie pour renseigner le nom de la nouvelle colonne et le délimiteur à placer entre les éléments, dans ce cas, un ","

cela donne lieu à une nouvelle colonne dans le tableau

Nettoyer le tableau en supprimant les colonnes qui ne sont plus nécessaires donne

Il ne reste plus qu'à replacer les résultats dans le tableau de données d'origine. Pour cela, la plateforme de mise à jour fera l'affaire. Cliquez sur le tableau d'origine et
Tableaux => Mise à jour

Remplissez le tableau pour obtenir la mise à jour et sélectionnez pour faire correspondre record_id de la table d'origine avec record_id de la table Split et cliquez sur OK et la table d'origine contiendra notre solution

Aucun script n'a été utilisé, seules 2 colonnes de formules simples étaient requises.
Maintenant, au fur et à mesure que l'on suit ces étapes, JMP place dans le journal le JSL requis pour créer les étapes interactives qui ont été exécutées. On peut donc simplement copier ces morceaux de JSL dans un script et, à la fin, avoir un script qui, une fois exécuté, fournira la solution en un clin d'œil.
names default to here(1);
dt = data table( "Example Table" );
// Stack data table
// → Data Table( "Stacked" )
dtStacked = Data Table( "example table" ) << Stack(
columns(
:date_1, :code 1, :date_2, :code 2, :date_3, :code 3, :date_4, :code 4,
:date_5, :code 5, :date_6, :code 6
),
Number of Series( 2 ),
Output Table( "Stacked" )
);
wait(0);
// Delete selected rows
Data Table( "Stacked" ) << Select Where( Is Missing( :Data 2 ) ) << Delete Rows;
// Delete columns
Data Table( "Stacked" ) << Delete Columns( :Label, :Label 2 );
// New column: is between
Data Table( "Stacked" ) << New Column( "is between",
Numeric,
"Continuous",
Format( "Best", 12 )
);
// Change column formula: is between
Data Table( "Stacked" ):is between << Set Formula(
:Data >= :Start date & :Data <= :Stop date
);
// Delete selected rows
Data Table( "Stacked" ) << Select Where( :is between == 0 ) << delete rows;
// Delete column: is between
Data Table( "Stacked" ) << Delete Columns( :is between );
// Delete columns
Data Table( "Stacked" ) << Delete Columns( :Stop date, :Start date, :Data );
// Split data table
// → Data Table( "Split" )
Data Table( "Stacked" ) << Split(
Split By( :Data 2 ),
Split( :Data 2 ),
Group( :record_id ),
Output Table( "Split" ),
Sort by Column Property
);
// Combine columns
Data Table( "Split" ) << Combine Columns(
columns( :"1"n, :"2"n, :"3"n ),
Column Name( "Result" ),
Delimiter( "," )
);
// Delete columns
Data Table( "Split" ) << Delete Columns( :"1"n, :"2"n, :"3"n );
// Update data table
Data Table( "example table" ) << Update(
With( Data Table( "Split" ) ),
Match Columns( :record_id = :record_id )
);
Vous pouvez également ouvrir un nouveau flux de travail, activer l'enregistreur et suivre les étapes. Vous obtiendrez ainsi un flux de travail qui pourra être utilisé ultérieurement pour créer la solution.
