SQL personalizado y evaluación/análisis (y \!\!\!...)¡Hola!
Hago muchas consultas que no pueden usar el generador de consultas JMP y deben escribirse en SQL personalizado.
Pero como también quiero generalizar mi código, tengo que integrar muchos eval/inserts y \!
Aquí hay un ejemplo:
Código aún no generalizado
New SQL Query(
Connection(
"ODBC:blabla"
),
QueryName( "v_test_run" ),
CustomSQL(
"SELECT \!"t1\!".lot_id
FROM \!"public\!".\!"v_test_run\!" \!"t1\!"
WHERE ( ( ( \!"t1\!".test_run_timestamp >= '2020-11-01 15:25:11' ) ) ) ;"
)
) << Modify;
Código generalizado para incluir una fecha:
gbStr = Eval Insert("
New SQL Query(
Connection(
\!"ODBC:blabla\!"
),
QueryName( \!"v_test_run\!" ),
CustomSQL(
\!"SELECT \!\!\!"t1\!\!\!".lot_id
FROM \!\!\!"public\!\!\!".\!\!\!"v_test_run\!\!\!" \!\!\!"t1\!\!\!"
WHERE ( ( ( \!\!\!"t1\!\!\!".test_run_timestamp >= '^date_deb^' ) ) ) ;\!"
)
) << Modify;
");
Eval( Parse( gbStr ) );Is there any other method that would save me from having to juggle with these \!\!\! symbols?
¡En scripts complejos es realmente difícil de manejar y depurar!
Gracias
Acceso a los datosRe: SQL personalizado y Eval / Parse (y \! \! \! ...)Hay algunas opciones descritas en Este artículo , Recomiendo comenzar con Eval (Eval Expr ()) y luego envolver cada pieza que necesita reemplazar con Expr ().Podría verse algo como esto:
Eval( Eval Expr(
New SQL Query(
Connection(
"ODBC:blabla"
),
QueryName( "v_test_run" ),
CustomSQL(
"\[SELECT "t1".lot_id
FROM "public"."v_test_run" "t1"
WHERE ( ( ( "t1".test_run_timestamp >= ']\" || datevariable || "\[' ) ) ) ;]\"
)
) << Modify
) );
Re: SQL personalizado y Eval / Parse (y \! \! \! ...)Usaría los delimitadores \ [y] \ para incluir comillas dobles en la cadena.
date_deb = "to_date('01-Mar-2019', 'dd-mon-yyyy')";
gbStr = Eval Insert("\[
New SQL Query(
Connection(
"ODBC:blabla"
),
QueryName( "v_test_run" ),
CustomSQL(
"SELECT "t1".lot_id
FROM "public"."v_test_run" "t1"
WHERE ( ( ( "t1".test_run_timestamp >= ^date_deb^ ) ) ) ;"
)
) << Modify;
]\");
write(gbstr);
Eval( Parse( gbStr ) );
Salida:
New SQL Query(
Connection(
"ODBC:blabla"
),
QueryName( "v_test_run" ),
CustomSQL(
"SELECT "t1".lot_id
FROM "public"."v_test_run" "t1"
WHERE ( ( ( "t1".test_run_timestamp >= to_date('01-Mar-2019', 'dd-mon-yyyy') ) ) ) ;"
)
) << Modify;Re: SQL personalizado y Eval / Parse (y \! \! \! ...)Estoy de acuerdo en que esta sintaxis solo es obvia una vez que la entiendes, e incluso entonces es confusa.Revisa este artículo de la lista de deseos para introducir una función Eval Expr First (), ¿tal vez sería más intuitivo?
Re: SQL personalizado y evaluación/análisis (y \!\!\!...)@pmroz Probé algo similar a lo anterior. después de la ejecución de SQL personalizado, el resultado que se devuelve es 1 al final del registro. ¿Podrías ayudarnos a explicar más sobre el resultado de 1? ¿Es el código de retorno Eval( Parse( gbStr ) ) el que mencionaste en tu script?

Re: SQL personalizado y evaluación/análisis (y \!\!\!...)Lo siento, no uso el Generador de consultas. Supongo que el valor de retorno de 1 es verdadero, lo que indica éxito. Pero eso podría ser una suposición descabellada.:)
Re: SQL personalizado y evaluación/análisis (y \!\!\!...)@pmroz gracias por tu respuesta. ¿Puedo contar con su apoyo para revisar el siguiente guión?
La consulta SQL suele tardar unos minutos en acceder a la base de datos. eliminar filas (si: rango> 1) a veces no se ejecuta, pero se puede hacer manualmente. No tengo idea... ¿No estoy seguro si mi script tiene algún problema?
date_deb = "to_date('01-Mar-2019', 'dd-mon-yyyy')";
gbStr = Eval Insert("\[
dt1 = New SQL Query(
Connection(
"ODBC:blabla"
),
QueryName( "v_test_run" ),
CustomSQL(
"SELECT "t1".lot_id
FROM "public"."v_test_run" "t1"
WHERE ( ( ( "t1".test_run_timestamp >= ^date_deb^ ) ) ) ;"
)
) << Run foreground;
]\");
write(gbstr);
Eval( Parse( gbStr ) );
dt1 << New Column( "Rank", Numeric, "Continuous", Format( "Best", 12 ) );
dt1:Rank << set Formula( Col Rank( :DATE* -1, :ID ) );
dt1 << Row Selection(select where(:Rank > 1 ));
dt1 << delete rows;
Re: SQL personalizado y evaluación / análisis (y \!\!\!...)Creo que la evaluación de la fórmula lleva algún tiempo,
una espera (0) obligaría a JMP a finalizar hasta que se realice la selección de filas (ver secuencia de comandos) y se pueda realizar la eliminación.
Realmente le recomiendo que mantenga la parte de la cadena lo más pequeña posible, ya que siempre es propensa a errores y difícil de leer.
Además, es una gran posibilidad utilizar JMP Tables para resolver este tipo de problemas y escribir scripts para la comunidad que todos puedan ejecutar de inmediato.
Edited: replaced "\C:\Program Files\JMP\JMPPRO\18\Samples\Data" by "$SAMPLE_DATA"
Names Default To Here( 1 );
// date_deb = "to_date('01-Mar-2019', 'dd-mon-yyyy')";
date_str = "2008-06-19";
/*
gbStr = Eval Insert("\[
dt1 = New SQL Query(
Connection(
"ODBC:blabla"
),
QueryName( "v_test_run" ),
CustomSQL(
"SELECT "t1".lot_id
FROM "public"."v_test_run" "t1"
WHERE ( ( ( "t1".test_run_timestamp >= ^date_deb^ ) ) ) ;"
)
) << Run foreground;
]\");
*/
dt1_sql = Eval Insert(
"\[SELECT t1.Date, t1.State, t1."Flu Cases", t1.Region,
t1."Population (July 2009)"
FROM "Seasonal Flu" t1
WHERE ( ( ( t1.Date >= JMPDATE('^date_str^') ) ) ) ;]\"
);
dt1 = New SQL Query(
Version( 130 ),
Connection( "JMP" ),
JMP Tables( ["Seasonal Flu" => "$SAMPLE_DATA\Seasonal Flu.jmp"] ),
QueryName( "SQLQuery1" ),
CustomSQL( dt1_sql )
) << run;
// Write( gbstr );
// Eval( Parse( gbStr ) );
dt1 << New Column( "Rank", Numeric, "Continuous", Format( "Best", 12 ) );
dt1:Rank << set Formula( Col Rank( :DATE * -1, /* :ID */ :State) );
wait(0);
dt1 << Row Selection( select where( :Rank > 1 ) );
dt1 << delete rows;
Re: SQL personalizado y evaluación/análisis (y \!\!\!...)@Georg gracias por la sugerencia. Es realmente una idea buena e inteligente mantener la parte de la cuerda lo más pequeña posible. Lo intenté y la eliminación aún falla con la espera (0). pero funciona para esperar (1). sin embargo, cuando accedo a datos de mayor tamaño desde el centro de datos SQL (probablemente me lleve unos minutos recuperar los datos del servidor), funciona hasta la espera (5). Supongo que col ranking() suele tardar algún tiempo en calcularse. A mayor tamaño de datos, más tiempo para el cálculo. cuando la selección de fila se ejecuta antes de que finalice el cálculo del rango de columnas, la eliminación fallará. ¿Hay alguna forma de determinar que el cálculo está completo? En caso afirmativo, puedo usar la función IF para ejecutar el siguiente paso.
Re: SQL personalizado y evaluación/análisis (y \!\!\!...)@ReliabilityWolf generalmente intentaría hacer el filtrado en la base de datos, por lo que depende del lenguaje SQL que tenga (también puede usar rango con subselección en SQL). Y ganas mucho tiempo para tráfico innecesario.
Además, evitaría usar una fórmula para esto; si desea tener valores únicos para el ID, puede ordenar en SQL y usar seleccionar filas duplicadas y eliminar, ver más abajo. La base de datos suele ser mucho más rápida al realizar estas tareas que su cliente.
En cuanto a las fórmulas, si lo necesita, quizás le ayude el mensaje de la tabla "ejecutar fórmulas" o "volver a ejecutar fórmulas". O puede eliminar la fórmula o escribir los resultados directamente en la columna...
Names Default To Here( 1 );
date_str = "2008-06-19";
dt1_sql = Eval Insert(
"\[SELECT t1.Date, t1.State, t1."Flu Cases", t1.Region,
t1."Population (July 2009)"
FROM "Seasonal Flu" t1
WHERE ( ( ( t1.Date >= JMPDATE('^date_str^') ) ) )
order by
t1.State, t1.date desc;]\"
);
dt1 = New SQL Query(
Version( 130 ),
Connection( "JMP" ),
JMP Tables( ["Seasonal Flu" => "$SAMPLE_DATA\Seasonal Flu.jmp"] ),
QueryName( "SQLQuery1" ),
CustomSQL( dt1_sql )
) << run;
dt1 << Select Duplicate Rows( Match( :State ) ) << delete rows();
Re: SQL personalizado y evaluación/análisis (y \!\!\!...)Realmente aprecio su nueva dirección sobre el filtrado en la base de datos. déjame echarle un vistazo a esto. gracias de nuevo.