Re: DuréeTal vez algo como esto:
For(k=1, k<=6, k++,
StartValue = Column(k+2)[1];
For(i=1, i<=6, i++,
If(num(Column(i+8)[1])>StartValue,break())
);
If(i<7, Write(Column("Date début "||(Column(i+8)<<GET name=""></GET>Re: Duracióngracias por su respuesta @pauldeen pero esta es una base de datos de prueba, este script debería funcionar para más de 700 columnas.
Re: DuréeUna solución un poco perezosa, pero podría funcionar
Names Default To Here(1);
dt = Open("$DOWNLOADS/AAAA.jmp");
// would get only numeric columns, but the provided example table is broken...
all_cols = dt << Get Column Names(/*Numeric, */"String");
// so first we have to fix the datatable
Remove From(all_cols, 1, 2);
For Each({col_name}, all_cols,
Column(dt, col_name) << Set Data Type("Numeric");
Column(dt, col_name) << Set Modeling Type("Continuous");
);
// create list of duration columns
// same amount of columns AND in same order for "number" and duration
date_cols = {};
some_cols = {};
For Each({col_name}, all_cols,
If(Starts With(lowercase(col_name), "date d"),
Insert Into(date_cols, col_name);
, !IsMissing(Regex(col_name, "^\d+$")),
Insert Into(some_cols, col_name);
,
show(col_name);
);
);
If(N Items(date_cols) != N Items(some_cols),
Throw("Column mismatch");
);
// create new columns
dur_cols = {};
For Each({some_col}, some_cols,
new_col = dt << New Column("duration " || some_col, Numeric, Continuous);
Insert Into(dur_cols, new_col << get name);
);
// calculation
For Each Row(
For Each({date_col, idx}, date_cols,
datesomething = dt[Row(), some_cols[idx]];
datesomethingvals = dt[Row(), some_cols];
// to make comparison easier
datesomethingvals[idx] = .;
datesomethingvals[Loc(datesomethingvals < datesomething)] = .; // lazy handling
idx_of_interest = Loc Min(Abs(datesomethingvals - datesomething));
If(idx_of_interest == 0,
continue();
);
val_of_interest = dt[Row(), date_cols[idx_of_interest]];
dt[Row(), dur_cols[idx]] = Abs(val_of_interest - dt[Row(), date_col]); // not sure if Abs is correct here
);
);
// durations for 900 and 4500 for some reason missing from demo dataRe: Duracióngracias por su respuesta @jthi !
Duración
Buenos días a todos,
Tengo una base de datos como la siguiente,

En el cómic, las celdas verdes son los resultados que nos gustaría obtener.
Me gustaría crear un script para calcular duraciones.
Tengo columnas de "fecha de inicio" y luego tengo una columna de "número" que indica el orden de ejecución.
El objetivo sería calcular "fecha de inicio y - fecha de inicio x" en función de los números.
Me explico en un ejemplo con la tira cómica:
1ra linea : Notamos que la columna "720" tiene el número 12 en la celda, entonces buscamos entre todas las columnas "número" la primera mayor a 12 (aquí columna "740" con el valor 21)
Entonces, la duración 720 sería la duración 720 = fecha de inicio 740 - fecha de inicio 720.
Entonces, para la duración 740, sería la duración 740 = fecha de inicio 9801 - fecha de inicio 740 con el mismo principio
Aquí está el guión que comencé a escribir:
dt = Current Data Table();
dur_cols = Filter Each( {col_name}, dt << Get Column Names( "String", Continuous ),
Starts With( col_name, "Date début" )
);
num_colnr = Transform Each( {col_name}, dur_cols, Word( -1, col_name ) );
char_cols = dt << Get Column Names ("string", Character);
wait(1);
N_taches = N Items(dur_cols);
for (i = 1, i <= N_taches, i++,
Eval(
Eval Expr(
col = dt << New Column ( "durée" || num_colnr[i], Numeric, "Continuous", Format(":jou:hh:m",8));
col << Formula(
colidx = Loc(dt[row(), char_cols] > Eval(num_colnr[i]))[1];
If ( N Items(colidx) > 0,
val = dur_cols[colidx] - Eval(dur_cols[i]);
If(IsMissing(val),
0
,
val
);
,
0
);
);
)));Gracias por su ayuda !
Investigación del Consumidor y del MercadoIngeniería de Calidad y ProcesosRe: Durée¿Entonces? Simplemente suba el número de recuento de bucles For. O hágalo dinámico incluyendo N cols() como límite superior.
Si ya resolviste esto, ¿podrías marcar este tema como resuelto?