Hola a todos,
Tengo dos dt y quiero crear una nueva columna en el dt primario en base a los datos del dt secundario.
Quiero un comando JSL que verifique la fecha en la columna de la fecha "dt1" y coincida con un número de grupo de "dt2" en función de la fecha de inicio y finalización. (periodo de tiempo)
dt1: (primario)
| fecha | Grupo |
| 17/05/2019 13:06 | |
| 17/05/2019 13:06 | |
| 23/05/2019 10:02 | |
| 24/05/2019 13:47 | |
dt2: (secundaria)
| Grupo | fecha de inicio | fecha final |
| 1 | 17/05/2019 20:15 | 18/05/2019 8:14 |
| 2 | 5/18/2019 8:15 | 18/05/2019 20:14 |
| 1 | 5/18/2019 20:15 | 19/05/2019 8:14 |
| 3 | 5/19/2019 8:15 | 19/05/2019 20:14 |
| 2 | 19/05/2019 20:15 | 20/05/2019 8:14 |
| 3 | 20/05/2019 8:15 | 20/05/2019 20:14 |
| 2 | 20/05/2019 20:15 | 21/05/2019 8:14 |
| 4 | 21/05/2019 8:15 | 21/05/2019 20:14 |
| 3 | 21/05/2019 20:15 | 22/05/2019 8:14 |
| 4 | 22/05/2019 8:15 | 22/05/2019 20:14 |
| 3 | 22/05/2019 20:15 | 23/05/2019 8:14 |
| 1 | 5/23/2019 8:15 | 23/05/2019 20:14 |
| 4 | 23/05/2019 20:15 | 24/05/2019 8:14 |
| 1 | 24/05/2019 8:15 | 24/05/2019 20:14 |
Tu ayuda será altamente apreciada.
Hola @ileshem ,
Hay algunas maneras en que yo podría hacer esto. Una forma sería crear una tabla que enumera los grupos para cada punto de tiempo entre la fecha de inicio y finalización, y luego podría usar esa tabla con Tablas> Actualizar para ingresar el número del grupo haciendo coincidir directamente con la nueva columna de fecha que abarca El comienzo y el final. Eso implicaría crear esa nueva tabla distribuida y, dependiendo de cuántos rangos de fechas tenga, esa tabla podría ser bastante grande.
Otra opción (a la que tengo preferencia en este caso) es usar Tablas> Generador de consultas JMP, que nos permitirá establecer una unión que pueda usar alguna lógica SQL para coincidir con una fecha después de una fecha de inicio pero antes de la fecha. fecha final. Puede diseñar esta consulta de forma interactiva, lo que es una de las razones por las que me gusta este enfoque, por lo que si no desea escribir algo, puede hacerlo todo con el mouse. Guardar los resultados de la secuencia de comandos en un jsl que no es demasiado difícil de generalizar, solo requiere algunos trucos para obtener solo los nombres de las tablas sin extensión, y para insertar los nombres de las tablas usando evalInsert (). Un poco extraño, y otros pueden tener una forma más elegante de hacer lo que hice aquí. Dicho esto, es una manera de ir sin escribir un JSL personalizado para ir fila por fila en una tabla para hacer la búsqueda en otra (lo cual es un enfoque tercero y totalmente aceptable también).
Aquí está el código para JMP Query Builder, y adjunté sus tablas de ejemplo para probar esto. Si está interesado en cómo configurar esto de manera interactiva, avíseme, se necesitan 30 segundos para construirlo desde cero.
dt1 = Data Table( "primary.jmp" );
dt2 = Data Table( "secondary.jmp" );
dt1NameOnly = Left( dt1 << getname, Length( dt1 << getname ) - 4 );
dt2NameOnly = Left( dt2 << getname, Length( dt2 << getname ) - 4 );
New SQL Query(
Version( 130 ),
Connection( "JMP" ),
JMP Tables( Eval Insert( "\[ [dt1<<GETNAME> "_MEMORY_", dt2<<GETNAME> "_MEMORY_"] ]\" ) ),
QueryName( "SQLQuery1" ),
Select( Column( "date", "t1", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) ), Column( "Group 2", "t2" ) ),
From(
Table( dt1NameOnly, Alias( "t1" ) ),
Table(
dt2NameOnly,
Alias( "t2" ),
Join(
Type( Left Outer ),
GE(
Column( "date", "t1", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) ),
Column( "Start Date", "t2", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) )
) & LE(
Column( "date", "t1", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) ),
Column( "End Date", "t2", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) )
)
)
)
)
) << Run;
</GETNAME></GETNAME>Hola de nuevo, @ileshem ,
Mencioné que podría resolver esto con jsl personalizado y quería compartir una forma de hacerlo con unos pocos bucles For () que funcionan fila por fila a través de su tabla principal para encontrar una fecha que cumpla con sus criterios en la tabla secundaria. Hay formas de hacerlo de manera más eficiente para aplicaciones muy grandes, pero esto es un comienzo.
dt1 = Data Table( "primary.jmp" );
dt2 = Data Table( "secondary.jmp" );
For( i = 1, i <= N Row( dt1 ), i++,
For( j = 1, j <= N Row( dt2 ), j++,
If( And( dt1:date[i] >= dt2:Start Date[j], dt1:date[i] <= dt2:End Date[j] ),
dt1:Group[i] = dt2:Group[j];
Break();
)
)
);
@Julian