Benvenuti nella Community.
Le istruzioni effettive che selezioneranno le righe all'interno di un dato intervallo di date e creeranno una nuova tabella dati contenente solo le righe selezionate.
// 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"));
Ecco un esempio completo che prima crea una tabella dati di esempio e poi esegue le righe precedenti per selezionare e creare la tabella dati.
(Nota: l'esempio seguente è stato in qualche modo omesso dal post originale. Grazie a @jthi per avermi avvisato dell'omissione)
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" )
);
Un altro modo interessante e interattivo per creare la nuova tabella è usare un filtro dati. Il filtro dati consente all'utente di selezionare interattivamente le righe nella tabella dati e, una volta selezionate le righe desiderate, è possibile creare una nuova tabella da quelle righe.
Per fare questo: una volta visualizzata la tabella dei dati

Vai al menu a discesa Righe e seleziona "Filtro dati"

Nella finestra Filtro dati, seleziona le date di inizio e fine e fai clic sul segno +

Verranno quindi visualizzati i filtri.
Fai clic sulle caselle di controllo Mostra e Includi. Indicano l'azione da intraprendere sulle righe nella tabella dati quando l'impostazione per i filtri seleziona le righe.

Ora i Filtri possono essere impostati per effettuare la selezione. Le linee blu possono essere trascinate sulle Date Stella e Fine desiderate, oppure i valori possono essere digitati direttamente nell'area data visualizzata per ogni filtro.
Si noti come le righe nella tabella dati vengono selezionate quando i filtri vengono modificati

Una volta selezionate le righe desiderate, è possibile creare una nuova tabella dati selezionando la selezione Show Subset dall'elenco delle azioni del triangolo rosso del Data Filter. Basta fare clic sul triangolo rosso accanto al titolo del Data Filter e selezionare l'opzione


Questa è una tabella di esempio da usare. Hai ragione, devo guardare ogni riga e ottenere i codici per ogni data tra le date di inizio e fine. Non importa se ci sono duplicati. In definitiva, ho bisogno di sapere se tutti i codici sono uguali o se ci sono codici diversi in ogni intervallo di tempo. Ho bisogno di sapere per ogni riga se i codici che rientrano tra le date di inizio e fine sono tutti "2" o tutti "3" o una combinazione di codici.
Penso che questo debba essere un qualche tipo di script, perché non riesco a pensare a una formula che funzioni. Non ho esperienza nella creazione di script, quindi qualsiasi aiuto sarebbe apprezzato!!
Questo può essere reso molto più semplice tenendo a mente la tua esigenza finale, ma poiché non esiste una colonna di specifiche/risultati esatti, ho appena creato qualcosa che penso dovrebbe aiutarti ad andare avanti
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, ", ");
);

Il codice di Jarmo è spettacolare. Mi piace vedere come affronta e risolve i problemi. Ma, per la maggior parte della mia vita, sono stato considerato dai miei colleghi, amici, moglie e figli come uno strano nei pensieri. Nei giorni buoni, mi chiamano "Nerd".
Quindi, data la mia posizione nella vita, ho scoperto che la maggior parte delle persone non la pensa come me.
@PruningTheSpark afferma
" Penso che questo debba essere un qualche tipo di script, perché non riesco a pensare a una formula che funzioni. Non ho esperienza nella creazione di script, quindi qualsiasi aiuto sarebbe apprezzato!! ".
Credo che la maggior parte degli utenti di JMP sia vicina alla posizione di PruningTheSpark. PruningTheSpark potrebbe non pensare che ci sia una soluzione non scripting al problema, ma le capacità interattive di JMP di manipolare i propri dati sono davvero potenti. Quindi di seguito ho messo insieme i passaggi interattivi necessari per risolvere il problema di PruningTheSpark.
Partendo dalla tabella dati di esempio fornita, l'ho modificata leggermente. Dati i risultati dello script di Jamo, mostra che nessuna delle righe ha più di un codice valido. Dato che più di un codice è un potenziale, ho aggiunto del codice nella riga 2 che mostrerebbe che la riga 2 ha più codici.

Il primo compito è trovare tutti i codici che rientrano nella Start Date e nella Stop Date. Poiché ci sono 6 colonne di codice diverse, il modo più semplice per fare tutto in una volta è impilare i dati.
Tabelle=>Pila

Si tratta di uno stack di serie multiple, che punta sulla data e sulle colonne del codice
Ora posso sbarazzarmi di tutti i codici che hanno valori mancanti poiché non saranno inclusi nei risultati. Quindi ho selezionato una cella che ha un valore mancante nella colonna Dati 2 che contiene tutti i codici e poi ho fatto clic con il pulsante destro del mouse e ho scelto Seleziona celle di accoppiamento

Che seleziona tutte le righe che presentano valori mancanti per la colonna Dati 2.
Fare clic con il pulsante destro del mouse sulla colonna RowState e selezionare Elimina righe

e ti rimangono solo le righe che hanno codici

Ora devo determinare quali di questi codici rientrano nella Data di inizio e nella Data di fine. Per questo creerò semplicemente una nuova colonna, che chiamerò "in between" che ha una formula di

che ha 1 per le righe in cui la colonna Dati (contiene la Data dalla tabella originale) ha 1 per essere nell'intervallo e 0 per essere fuori dall'intervallo

Utilizzando la stessa tecnica utilizzata per eliminare i codici con un valore mancante, è possibile selezionare ed eliminare le righe con zeri

Per ripulire la tabella, è possibile eliminare alcune delle colonne non più necessarie

Ora il compito è riportare i codici in singole righe. Per fare questo, si può fare una semplice Split
Tabelle=>Dividi


Ora per combinare le colonne di codice in una colonna, si può usare un'utilità di colonna chiamata Combine Columns. Basta selezionare le colonne che devono essere combinate e poi
Cols=>Utilità=>Combina colonne

Che apre una casella di input per inserire il nome della nuova colonna e quale delimitatore inserire tra gli elementi, in questo caso, ","

questo fa sì che la tabella abbia una nuova colonna

Pulisci la tabella eliminando le colonne non più necessarie

Ora tutto ciò che deve essere fatto è spostare i risultati nella tabella dati originale. Per farlo, la piattaforma Update farà al caso tuo. Fai clic sulla tabella originale e
Tabelle=>Aggiorna

Compila la tabella da cui ottenere l'aggiornamento e seleziona per abbinare record_id della tabella originale con record_id dalla tabella Dividi e fai clic su OK e la tabella originale conterrà la soluzione

Non è stato utilizzato alcuno script, erano necessarie solo 2 semplici colonne di formule.
Ora, mentre si eseguono questi passaggi, JMP inserisce nel log il JSL necessario per creare i passaggi interattivi che sono stati eseguiti. Quindi si possono semplicemente copiare quei pezzi di JSL in uno script e alla fine avere uno script che, quando eseguito, fornirà la soluzione in un batter d'occhio.
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 )
);
È anche possibile aprire un nuovo flusso di lavoro, accendere il registratore e seguire i passaggi: si otterrà un flusso di lavoro che potrà essere utilizzato in futuro per creare la soluzione.
