differenza di giorni nella stessa colonna di scenari diversiSalve, ho domande per diversi scenari come di seguito. Apprezzo davvero qualsiasi aiuto!
Scenario A : Voglio aggiungere quest'ultima colonna, calcolando per quell'ID utente, qual è la differenza del giorno Primo web a Primo data di prenotazione. Se non ha effettuato alcuna azione web prima dell'azione di prenotazione, lascia il campo vuoto. Qualcuno potrebbe aiutarmi con come dovrebbe apparire la formula usando la funzione ma non jsl?
| ID utente | azione | data | dalla prima data web alla prima data di prenotazione |
| 2523 | ragnatela | 2018-05-06 | 22 |
| 2523 | ragnatela | 2018-05-16 | 22 |
| 2523 | prenotazione | 28-05-2018 | 22 |
| 2523 | prenotazione | 2018-06-08 | 22 |
| 2523 | ragnatela | 2018-07-08 | 22 |
| 2523 | prenotazione | 2018-08-08 | 22 |
Scenario B : in base alla tabella sopra, voglio calcolare un'altra tabella come quella seguente che contiene per ciascun ID utente, la differenza del giorno tra ' la prima data dell'azione web" "prima delle prenotazioni" A ogni data di prenotazione . In base alla logica, il risultato ideale con la tabella precedente come input sarà il seguente: 3 istanze di differenza giornaliera per questo ID utente. Come nello scenario A, consideriamo solo quando il web è precedente alla prenotazione.
| ID utente | esempio | calcolo |
| 2523 | 22 | 5/28 meno 5/6 |
| 2523 | 33 | 6/8 meno 5/6 |
| 2523 | 31 | 8/8 meno 7/8 |
Grazie!
Ingegneria della qualità e dei processiRi: differenza di giorni nella stessa colonna di diversi scenariFunziona! Grazie mille Georg! Impareremo dal collegamento di Matrix e Loc. Apprezzo davvero il tuo aiuto.Ri: differenza di giorni nella stessa colonna di diversi scenariCIAO @joann , mi spiace dirlo ma questa non è la piattaforma per il servizio completo, ma saremo felici di poterti supportare. Quindi se vuoi imparare consulta la documentazione online sulle funzioni usate qui.
Ad esempio, loc ti fornisce l'indice di un vettore per determinati valori:
Funzioni di localizzazione (jmp.com)
Si prega di vedere lo script di seguito per entrambi gli scenari. Lo scenario B è abbastanza simile...
Se vuoi avere la tabella esatta per lo scenario B come hai descritto, puoi eliminare la formula (che quindi mantiene i valori) e selezionare i valori mancanti nella colonna "Formula B" ed eliminarli.
BR
names default to here(1);
// create the example table
New Table( "20210404_user_web_booking_matrixexample",
Add Rows( 12 ),
Compress File When Saved( 1 ),
New Column( "userID",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[2523, 2523, 2523, 2523, 2523, 2523, 2540, 2540, 2540, 2540, 2540, 2540]
),
Set Display Width( 66 )
),
New Column( "action",
Character( 16 ),
"Nominal",
Set Values(
{"web", "web", "booking", "booking", "web", "booking", "web", "web",
"booking", "booking", "web", "booking"}
),
Set Display Width( 73 )
),
New Column( "date",
Numeric,
"Continuous",
Format( "y/m/d", 12 ),
Input Format( "y/m/d" ),
Set Values(
[3608409600, 3609273600, 3610310400, 3611260800, 3613852800, 3616531200,
3647462400, 3647548800, 3647635200, 3647721600, 3647808000, 3647894400]
),
Set Display Width( 92 )
),
New Column( "first web date to first booking date",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [22, 22, 22, 22, 22, 22, ., ., ., ., ., .] ),
Set Display Width( 150 )
),
New Column( "formula_A",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
Names Default To Here( 1 );
// convert columns to vectors
dat_vec = :date << get values;
web_vec = :action << get values;
user_vec = :userID << get values;
// get a vector with subscripts of current userID
user_index = user_vec == :userID[Row()];
// get a vctor with subscripts where action=web
web_index = Matrix(
Substitute( :action << get values, "web", 1, "booking", 0 )
);
// get a vector with dates for current userID and action=web
web_dat = dat_vec[Loc( user_index & web_index )];
// the same for booking (actually not web)
booking_dat = dat_vec[Loc( user_index & !web_index )];
// calculate minimum of both date vectors and subtract
(Minimum( booking_dat ) - Minimum( web_dat )) / (3600 * 24);
),
Set Display Width( 146 )
),
New Column( "formula_B",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
Names Default To Here( 1 );
dat_vec = :date << get values;
web_vec = :action << get values;
user_vec = :userID << get values;
user_index = user_vec == :userID[Row()];
web_index = Matrix(
Substitute( :action << get values, "web", 1, "booking", 0 )
);
web_dat = dat_vec[Loc( user_index & web_index )];
booking_dat = dat_vec[Loc( user_index & !web_index )];
// when current action is booking, then subtract minimum web date, otherwise keep empty, and divide seconds by seconds of day
If( :action == "booking", :date - Minimum( web_dat ), . ) / (3600 * 24);
),
Set Selected
)
);Ri: differenza di giorni nella stessa colonna di diversi scenariGrazie Georg! Funziona. Potresti spiegarmi la logica dietro questo script? Non ho molta familiarità con Matrix e Loc qui.
Per caso hai la soluzione per lo scenario 2?
Grazie!Ri: differenza di giorni nella stessa colonna di diversi scenariGrazie Thierry! Il risultato sembra buono! Potresti spiegarmi cosa fa l'ID transazione? Non capisco la logica/formula.
Per caso hai la soluzione per lo scenario B? Nello scenario B la seconda prenotazione conta.
Grazie!Ri: differenza di giorni nella stessa colonna di diversi scenariPenso che la seguente formula andrà bene per lo scenario A:
Non è ancora ottimizzato, ma potrebbe mostrarti come eseguire operazioni del genere.
Utilizza alcuni semplici jsl in una formula, passo dopo passo.

Consulta lo script completo per la generazione della tabella:
New Table( "20210404_user_web_booking_matrixexample",
Add Rows( 12 ),
Compress File When Saved( 1 ),
New Column( "userID",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[2523, 2523, 2523, 2523, 2523, 2523, 2540, 2540, 2540, 2540, 2540, 2540]
),
Set Display Width( 66 )
),
New Column( "action",
Character( 16 ),
"Nominal",
Set Values(
{"web", "web", "booking", "booking", "web", "booking", "web", "web",
"booking", "booking", "web", "booking"}
),
Set Display Width( 73 )
),
New Column( "date",
Numeric,
"Continuous",
Format( "y/m/d", 12 ),
Input Format( "y/m/d" ),
Set Values(
[3608409600, 3609273600, 3610310400, 3611260800, 3613852800, 3616531200,
3647462400, 3647548800, 3647635200, 3647721600, 3647808000, 3647894400]
),
Set Display Width( 92 )
),
New Column( "first web date to first booking date",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [22, 22, 22, 22, 22, 22, ., ., ., ., ., .] ),
Set Display Width( 150 )
),
New Column( "formula",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
Names Default To Here( 1 );
dat_vec = :date << get values;
web_vec = :action << get values;
user_vec = :userID << get values;
user_index = user_vec == :userID[Row()];
web_index = Matrix(
Substitute( :action << get values, "web", 1, "booking", 0 )
);
web_dat = dat_vec[Loc( user_index & web_index )];
booking_dat = dat_vec[Loc( user_index & !web_index )];
(Minimum( booking_dat ) - Minimum( web_dat )) / (3600 * 24);
),
Set Selected
)
)Ri: differenza di giorni nella stessa colonna di diversi scenariCiao Joann,
Dopo aver giocato un po', sono riuscito a produrre una serie di formule di colonna che producono l'output desiderato (vedi allegato). È importante sottolineare che la tabella deve essere ordinata per "userId" e "data" affinché le formule funzionino correttamente.
Migliore,
TS
Ri: differenza di giorni nella stessa colonna di diversi scenariCiao Joann,
Un paio di domande per vedere se è possibile sviluppare una soluzione semplice:
1) Ti capita di avere una colonna che distingua tra la prima sequenza (righe 1 - 4) e la seconda sequenza (righe 4 - 6); senza questo, è un po' più difficile creare formule di colonna che distinguano i due set di transazioni.
2) Se ho capito bene, la seconda data di prenotazione (riga 4) non è rilevante per la tua domanda.
Fatecelo sapere al più presto.
Migliore,
TS