diferencia de días en la misma columna de diferentes escenariosHola, tengo preguntas para diferentes escenarios como se muestra a continuación. ¡Realmente agradezco cualquier ayuda!
Escenario A : Quiero agregar esta última columna, calculando para ese ID de usuario, ¿cuál es la diferencia de días con respecto a primero web para primero fecha para registrarse. Si no tuvo ninguna acción web antes de realizar la reserva, déjelo vacío. ¿Alguien podría ayudarme con cómo debería verse la fórmula usando la función pero no jsl?
| ID de usuario | acción | fecha | desde la primera fecha web hasta la primera fecha de reserva |
| 2523 | web | 2018-05-06 | 22 |
| 2523 | web | 2018-05-16 | 22 |
| 2523 | reserva | 2018-05-28 | 22 |
| 2523 | reserva | 2018-06-08 | 22 |
| 2523 | web | 2018-07-08 | 22 |
| 2523 | reserva | 2018-08-08 | 22 |
Escenario B : según la tabla anterior, quiero calcular otra tabla como la siguiente que contiene para cada ID de usuario la diferencia de días entre ' la primera fecha de acción web' 'antes de reservar' a cada fecha de reserva . Según la lógica, el resultado ideal con la tabla anterior como entrada será el siguiente: 3 instancias de diferencia de días para este ID de usuario. Igual que en el escenario A, sólo consideramos cuando la web es previa a la reserva.
| ID de usuario | instancia | cálculo |
| 2523 | 22 | 5/28 menos 5/6 |
| 2523 | 33 | 6/8 menos 5/6 |
| 2523 | 31 | 8/8 menos 7/8 |
¡Gracias!
Ingeniería de Calidad y ProcesosRe: diferencia de días en la misma columna de diferentes escenarios¡Funciona! ¡Muchas gracias Jorge! Aprenderá del enlace de Matrix y Loc. Realmente aprecio tu ayuda.Re: diferencia de días en la misma columna de diferentes escenariosHola @joann Lamento decirlo, pero esta no es la plataforma para un servicio completo, pero estaremos felices si podemos brindarle asistencia. Entonces, si desea aprender, consulte la documentación en línea sobre las funciones utilizadas aquí.
Por ejemplo, loc te da el índice de un vector para ciertos valores:
Funciones de ubicación (jmp.com)
Consulte el siguiente script para ambos escenarios. El escenario B es bastante similar...
Si desea tener la tabla exacta para el escenario B como describió, puede eliminar la fórmula (que mantiene los valores en ese momento), seleccionar los valores que faltan en la columna "Fórmula B" y eliminarlos.
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
)
);Re: diferencia de días en la misma columna de diferentes escenarios¡Gracias Jorge! Funciona. ¿Podrías explicarme la lógica detrás de este script? No estoy muy familiarizado con Matrix y Loc aquí.
¿Tiene la solución para el escenario 2?
¡Gracias!Re: diferencia de días en la misma columna de diferentes escenarios¡Gracias Thierry! ¡El resultado parece bueno! ¿Podría explicarme qué hace Transaction ID? No entiendo la lógica/fórmula.
¿Tiene la solución para el escenario B? En el escenario B, las segundas reservas son importantes.
¡Gracias!Re: diferencia de días en la misma columna de diferentes escenariosCreo que la siguiente fórmula servirá para el escenario A:
Aún no está optimizado, pero puede mostrarle cómo se pueden hacer este tipo de cosas.
Utiliza un jsl simple en una fórmula, paso a paso.

Consulte el script completo para la generación de tablas:
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
)
)Re: diferencia de días en la misma columna de diferentes escenariosHola Joann,
Después de jugar un poco, pude producir un conjunto de fórmulas de columna que producen el resultado deseado (ver adjunto). Es importante destacar que la tabla debe estar ordenada por "userId" y "fecha" para que las fórmulas funcionen correctamente.
Mejor,
TS
Re: diferencia de días en la misma columna de diferentes escenariosHola Joann,
Un par de preguntas para ver si se podría desarrollar una solución simple:
1) ¿Tendría una columna que diferenciaría entre la primera secuencia (filas 1 - 4) y la segunda secuencia (filas 4 - 6)? sin esto, es un poco más difícil crear fórmulas de columnas que distingan los dos conjuntos de transacciones.
2) Si entiendo correctamente, la segunda fecha de reserva (fila 4) no es relevante para su pregunta.
Háganos saber lo antes posible.
Mejor,
TS