
[RESUELTO] Consulta de comparacion en una misma tabla.
#1
Posted 10 April 2010 - 09:55 AM
Tengo una tabla con los siguientes campos :
id (int)
id_usuario (int)
fecha (datetime)
peso (double)
Quiero obtener una lista de registros que, tengan una diferencia menor de 30 segundos entre el registro N y el N+1 ...
ejemplo
DATOS TABLA
id id_usu fecha peso
23 4 '2010-03-23 09:25:13' 5.540
24 4 '2010-03-23 09:25:55' 5.500
25 4 '2010-03-23 09:26:00' 5.530
26 4 '2010-03-23 09:27:45' 5.510
27 4 '2010-03-23 09:28:18' 5.545
28 4 '2010-03-23 09:29:20' 5.535
29 4 '2010-03-23 09:29:25' 5.580
30 4 '2010-03-23 09:30:30' 5.540
31 4 '2010-03-23 09:31:40' 5.520
y lo que intento hacer es una consulta que me regreso los registros que, entre ellos, haya una diferencia MENOR a 30 segundos...
en este caso, el resultado seria:
id id_usu fecha peso
24 4 '2010-03-23 09:25:55' 5.500
25 4 '2010-03-23 09:26:00' 5.530
28 4 '2010-03-23 09:29:20' 5.535
29 4 '2010-03-23 09:29:25' 5.580
como seria la consulta ???
Lo primero que se me ocurrio fue hacer una copia de la tabla, y asi tener TABLA1 y TABLA2 ... y con delphi
recorres las tablas empezando la TABLA1 en el registro 1 y la TABLA2 en el registro 2 .... y asi ir comparando los registros...
hay alguna forma de hacerlo directamente con una consulta sobre la misma tabla ???
gracias...
Salu2!!!!!!!
#2
Posted 10 April 2010 - 12:01 PM
#3
Posted 10 April 2010 - 12:57 PM
ESOS DATOS ya estan registrados...
se capturan por un sistema ya implementado, al cual no le puedo meter mano...
lo que tengo que hacer, es 'limpiar' esos registros en base a lo que pido, que tengan diferencia entre uno y otro menor de 30 segundos.
gracias...
salu2!!!!!!!
#4
Posted 10 April 2010 - 04:32 PM
hay otro detalle que se me paso comentar...
ESOS DATOS ya estan registrados...
se capturan por un sistema ya implementado, al cual no le puedo meter mano...
lo que tengo que hacer, es 'limpiar' esos registros en base a lo que pido, que tengan diferencia entre uno y otro menor de 30 segundos.
gracias...
salu2!!!!!!!
aun así sigo eligiendo el SP, aunque la idea también puede funcionar en delphi
#5
Posted 11 April 2010 - 09:23 AM
SELECT id AS id_inicial (SELECT FIRST 1 siguiente.id FROM tabla siguiente WHERE siguiente.id > inicial.id ORDER BY siguiente.id) AS id_siguiente, fecha AS fecha_inicial, (SELECT FIRST 1 siguiente.fecha FROM tabla siguiente WHERE siguiente.id > inicial.id ORDER BY siguiente.id) AS fecha_siguiente, peso AS peso_inicial, (SELECT FIRST 1 siguiente.peso FROM tabla siguiente WHERE siguiente.id > inicial.id ORDER BY siguiente.id) AS peso_siguiente, FROM tabla inicial WHERE fecha - (SELECT FIRST 1 siguiente.fecha FROM tabla siguiente WHERE siguiente.id > inicial.id ORDER BY siguiente.id) <= (30.0000 * 1 / (24 * 60 * 60)) ORDER BY id
Saludos.
#6
Posted 11 April 2010 - 10:02 AM
Gracias Marc por la ayuda...
pero me da un error esa consulta...
error : syntax to use near "1 siguiente.id FROM produccion sig ......"
por que o para que se usaria el FIRST 1 dentro de la consulta ???
gracias...
salu2!!!!!!!
#7
Posted 11 April 2010 - 01:52 PM
No conozco MySQL y no sé que cláusulas SQL soporta.
Prueba con LIMIT 1 en lugar de FIRST 1, o bien ROWS 1 (aunque en este caso se pone al final de la subconsulta)
Saludos.
#8
Posted 11 April 2010 - 02:10 PM
gracias...
salu2!!!!!!!
#9
Posted 11 April 2010 - 02:14 PM
Por ejemplo, la subconsulta :
(SELECT LIMIT 1 siguiente.fecha FROM tabla siguiente WHERE siguiente.id > inicial.id ORDER BY siguiente.id) AS fecha_siguiente
Lo que hace es devolver la fecha del primer registro que tiene el ID mayor al ID del registro de la consulta principal.
NOTA: Normalmente esta subconsulta haría lo mismo, pero solo si las fechas y los ID's son correlativos.
(SELECT MIN(siguiente.fecha) FROM tabla siguiente WHERE siguiente.id > inicial.id) AS fecha_siguiente
Saludos.
#10
Posted 11 April 2010 - 02:23 PM
Muchas gracias....
y es que si, yo hago las consultas (algunas) como lo pones en la segunda forma, con el MIN() o el MAX()
Ya entendi el asunto del FIRST 1 ... gracias por la explicacion...
ahora procedo a acomodar la consulta que pusiste... a ver que resultado obtengo...
Gracias de nuevo...
Salu2!!!!!!!
#11
Posted 11 April 2010 - 03:49 PM
Muchas gracias Marc por tu ayuda...
con tu consulta SQL y explicacion pude resolver mi problema...
aunque modifique el asunto de la fecha, por que nomas no pude haciendo la resta, mejor utilice la funcion TIMEDIFF
a continuación pongo la consulta final...
SELECT id AS id_inicial, id_usuario, (SELECT siguiente.id FROM produccion siguiente WHERE siguiente.id > inicial.id AND id_usuario = 1 ORDER BY siguiente.id LIMIT 1 ) AS id_siguiente, fecha AS fecha_inicial, (SELECT siguiente.fecha FROM produccion siguiente WHERE siguiente.id > inicial.id AND id_usuario = 1 ORDER BY siguiente.id LIMIT 1 ) AS fecha_siguiente, peso AS peso_inicial, (SELECT siguiente.peso FROM produccion siguiente WHERE siguiente.id > inicial.id AND id_usuario = 1 ORDER BY siguiente.id LIMIT 1 ) AS peso_siguiente FROM produccion inicial WHERE (TIMEDIFF((SELECT siguiente.fecha FROM produccion siguiente WHERE siguiente.id > inicial.id AND id_usuario = 1 ORDER BY siguiente.id LIMIT 1), fecha)) < ('00:00:30') ORDER BY id
Gracias...
Salu2!!!!!!!