Generador de consultas: registros únicos<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hola ,
Después de un poco de lucha personal para resolver mi problema, decidí publicarlo como una pregunta para la comunidad de usuarios y JMP.
Tenga una base de datos de la que se extraigan p1, p2, activos y tiempo. La base de datos es una base de datos acumulativa, lo que significa que los parámetros p1 y p2 se cargan como representación del último estado para cada activo en un especifico tiempo . En otras palabras, las instancias anteriores anteriores de p1 y p2 no son válidas, y se necesitan las versiones más recientes de p1 y p2 para un determinado activo a más tardar informado tiempo .
Por lo tanto, lo que necesito es un orden descendente a través de tiempo y luego obligar al resultado a ser único en activo nivel.
¿Alguna idea de cómo necesito dirigir esto en el generador de consultas?
Prefiero tener una solución al no usar un SQL personalizado.... De hecho, tengo una solución en SQL personalizado, pero me gusta aprender cómo hacer esto dentro del generador de consultas, ya que agregaré algunas piezas más que serán difíciles de hacer en SQL personalizado.
Agradezco la ayuda.
Altugbayram
Re: Generador de consultas - Registros únicosEsta es una publicación antigua, pero aquí va:
@altug_bayram escribió:
Olvidé agregar...
La razón por la que no pude hacer que su consulta funcionara originalmente es que no me estaba refiriendo a la base de datos de la manera correcta. Una vez que hicimos eso, funcionó.
¿Cuál fue la manera correcta? También recibo un error que dice "ERROR: la relación "databases_enzyme_db" no existe; Error al preparar los parámetros [SQLSTATE=42P01]" y no estoy seguro de cómo solucionarlo.
Re: Generador de consultas - Registros únicosMi placer.Este hilo realmente impulsó mi comprensión de las subconsultas.Aprendí mucho.
Cuidarse,
eric
Re: Generador de consultas - Registros únicoseric,
Ahora lo entiendo mejor y estoy de acuerdo contigo. Una vez más, gracias por el esfuerzo que brindó a este problema.
Tu ayuda ha sido muy valiosa.
Re: Generador de consultas - Registros únicosSe puede ejecutar la versión original solo con Time y usar la agregación MAX en X para devolver las filas correctas, pero no podrá averiguar los valores de p1 y p2 para esas filas.Si hago lo que dijiste dejando p1 y p2 en la consulta, obtengo todas las filas con los tiempos máximos duplicados, porque p1 y p2 se convierten en GROUP BY para la consulta:

Ahora, si elimino p1 y p2 de la consulta, la consulta devuelve las filas correctas:

pero el objetivo era encontrar los valores de p1 y p2 para esas filas, y desaparecieron.Entonces, creo que el enfoque de doble subconsulta es el único enfoque que responde a la pregunta que hizo.
eric
Re: Generador de consultas - Registros únicoseric,
Funcionó a las mil maravillas ...
Sin embargo, me pregunto... ¿también habría funcionado al ejecutar la primera versión original de epxression personalizada (con solo tiempo) Y al elegir la agregación X como "Máximo" dentro del campo "Columnas incluidas"...?
muchas gracias ....
Re: Generador de consultas - Registros únicosDISTINCT no ayudará al OP, porque realmente no hay filas distintas aquí.
Encontré una consulta que resolvería el segundo caso.Agregué 6 filas en la parte inferior que duplican los tiempos máximos para cada activo, además agregué una variable X.Aquí está la tabla:

Y aquí está la consulta que funciona (requiere una subconsulta y una subconsulta dentro de una subconsulta)):

La expresión personalizada es:
t1.Time = (SELECT MAX(tInner.Time) FROM partes tInner DONDE t1.Asset = tInner.Asset)
Y
t1.X = (SELECT MAX(tInner.X) FROM partes tInner WHERE t1.Asset = tInner.Asset AND
tInner.Time = (SELECT MAX(tInner2.Time) FROM partes tInner2 WHERE tInner.Asset = tInner2.Asset))
Puse en mayúsculas todas las palabras clave de SQL para que sea más fácil de leer.Intenté algunas consultas más simples, pero no funcionaron.
HH,
eric
Re: Generador de consultas - Registros únicosSi se trata de una entrada duplicada, tal vez el uso de la palabra clave DISTINCT ayude.
Re: Generador de consultas - Registros únicosOlvidé agregar...
La razón por la que no pude hacer que su consulta funcionara originalmente es que no me estaba refiriendo a la base de datos de la manera correcta. Una vez que hicimos eso, funcionó.
Re: Generador de consultas - Registros únicoseric,
Muchas gracias ....
Lo siento, me tomé un tiempo para resolverlo con otra persona experta en consultas en GE.
¡Tu solución (la primera) definitivamente funcionó! Aún no he probado el segundo.
Tengo un problema más:
Resulta que las personas que completan la base de datos insertaron una entrada duplicada para algunos activos en el mismo último momento cronológico. Entonces, para evitarlo, tengo otra columna titulada digamos X . Manualmente, simplemente elegiría los dos con la X más grande. No quería convertir de Max (Tiempo) a Max (X) ya que X por sí mismo puede no ser tan confiable, pero sería el factor de selección para entradas de tiempo duplicadas.
Intentamos convertir su expresión personalizada original para incluir un segundo MAX (en X)... pero eso no funcionó...
Entonces... tratando de extraer cada activo donde el tiempo es MAX y si hay varias entradas seleccionando la entrada con Max(X)
Alguna sugerencia
Re: Generador de consultas - Registros únicosMi ejemplo original fue para SQL Server, que es un poco más indulgente.Para Oracle, tuve que formatear el nombre de la tabla en la subconsulta como schema.table, además tuve que citar mis nombres de mayúsculas y minúsculas:
t1."Tiempo" = (seleccione MAX(t2."Tiempo") de PRUEBASQB. "partes" t2 donde t2."Activo" = t1."Activo")
Intenta cambiar mi mesa en tu primer intento de .mi_tabla y ver si eso ayuda.
eric
Re: Generador de consultas - Registros únicosOye, Altug,
¿Qué base de datos estas usando?
¿Estaría dispuesto a compartir el SQL de su consulta SQL personalizada que le da el resultado que está buscando?
Gracias,
eric
Re: Generador de consultas - Registros únicosHola Eric,
Primero gracias por tu ayuda....
Su comprensión es correcta. Solo estoy tratando de extraer una sola fila para cada activo donde el tiempo es máximo (o más reciente).
Apliqué tus fórmulas. Sin embargo, me está dando un error.
Primero lo apliqué como el nombre real de la tabla y luego como "t1"
t1.calendar_month = (seleccione MAX(calendar_month) de my_table t2 donde t1.engine_serial_num = t2.engine_serial_num)
t1.calendar_month = (seleccione MAX(calendar_month) de t1 t2 donde t1.engine_serial_num = t2.engine_serial_num)
ERROR: la relación "mi_tabla" no existe.
ERROR al ejecutar la consulta [ SQLSTATE: 42P01 ]
Re: Generador de consultas - Registros únicosOye, Altug,
Aquí hay una tabla que creo que se parece a lo que está describiendo (pero suponga que está en una base de datos en lugar de JMP):

Tengo entendido que le gustaría recuperar una fila para A1, A2, A3 y A4 para las cuales el tiempo es el máximo.¿Es eso correcto?
No creo que eso sea posible sin hacer una subconsulta que use la función MAX, que puede hacer usando un filtro de Expresión personalizada.Aquí está la consulta con la que terminé:

En caso de que sea demasiado pequeño para leer, la expresión personalizada es:
t1.Time = (seleccione MAX(Time) de las partes t2 donde t1.Asset = t2.Asset)
Entonces, pasa el valor de Activo de la consulta principal (t1.Asset) y selecciona las filas que tienen el valor de Tiempo máximo para ese activo.
Avísame si eso ayuda.
eric
Re: Generador de consultas - Registros únicosFactura
Gracias por la pronta respuesta.
Sin embargo, a menos que me falte algo crítico aquí, esto no resuelve mi problema.
1) El último punto válido de cualquier activo normalmente no está en el mismo punto de tiempo, son bastante diferentes. Pueden tener años de diferencia.
2) No busco una pronta solución si es posible. Necesito que esto sea completamente automatizado.
3) Realmente no estoy seguro de cómo "Filtrar por" con >= puede hacerlo único tampoco. Creo que preferiste filtrar por "="
Así que necesito un enfoque que recoja la entrada cronológica más reciente para cualquier activo sin tener que especificar un filtro de tiempo (porque los datos más recientes pueden estar en cualquier lugar en el tiempo).
Gracias.
Re: Generador de consultas - Registros únicosHola Altug,
Consulte la imagen a continuación para obtener un orden descendente de tiempo.
Haga clic con el botón derecho en su variable de tiempo en Columnas disponibles y seleccione "Ordenar por". Aparecerá un nuevo cuadro de diálogo en la esquina inferior derecha.Desde allí, puede elegir la flecha descendente para obtener el orden de tiempo deseado.
Luego podría usar un filtro con un mensaje para seleccionar un nivel de activo único.
