Aquí hay una pregunta que me he estado haciendo un desastre. Digamos que tengo una tabla que tiene una serie de marcas de tiempo y un número de parte como la clave principal. La tabla almacena cambios incrementales, lo que significa que para cada marca de tiempo, si un campo cambia, ese cambio se registra. Si el campo no cambia, entonces para la nueva marca de tiempo es NULL. Aquí está la idea básica.Base de datos: Seleccione las últimas entradas no nulas
part | timestamp | x-pos | y-pos | status
------+-----------+-------+-------+--------
a5 | 151 | 5 | 15 | g
a5 | 153 | NULL | 17 | NULL
(part, timestamp)
es la clave principal. Los NULL
s en el segundo registro indican valores que no han cambiado desde el primer registro.
Lo que quiero poder hacer es seleccionar los valores más recientes para cada campo agrupado por la parte. Por ejemplo, dadas las entradas anteriores, los resultados serán 153,5,17, g para la parte a5.
Por el momento, tengo esta consulta hackeada.
((SELECT x-pos FROM part_changes WHERE x-pos IS NOT NULL
ORDER BY timestamp DESC
LIMIT 1)
UNION
(SELECT y-pos FROM part_changesWHERE y-pos IS NOT NULL
ORDER BY timestamp DESC
LIMIT 1)
UNION
(SELECT status FROM part_changes WHERE status IS NOT NULL
ORDER BY timestamp DESC
LIMIT 1))
Pero esto devuelve una sola columna, lo que significa que puedo usar un grupo para organizar.
Tiene que haber una forma más elegante de hacer las cosas, como usar COALESCE o IS NULL de una manera creativa. Pero estoy atascado y no puedo entenderlo. Alguien tiene una idea?
Y no, no puedo cambiar la estructura de la base de datos.
EDITAR: ruakh tiene la idea correcta. El único problema ahora es agrupar por partes. Parece que no puedo evitar el LIMIT 1
para agrupar por varias partes. ¿Algunas ideas?
mdahlman, no estoy muy familiarizado con las funciones analíticas en postgresql. Entonces, si esa solución sería más fácil que una consulta compleja, entonces, por supuesto, publique su idea.
EDIT 2: Gracias a todos por la ayuda. Creo que tengo una buena comprensión de lo que tengo que hacer.
Debe especificar si las funciones analíticas están permitidas. Con ellos, la respuesta debería ser simple. Sin ellos ... va a ser difícil. – mdahlman
¿hay un límite de cuántos valores nulos pueden ocurrir? Si hubiera un límite, sería una solución con algunas combinaciones de la izquierda ... no es bueno, pero podría hacerse;) – rauschen
No creo que haya un límite. De hecho, uno de los campos tiene la gran mayoría (algo así como el 99%) de los registros como NULL. –