Ir al contenido


Foto

[RESUELTO] Consulta de comparacion en una misma tabla.


  • Por favor identifícate para responder
10 respuestas en este tema

#1 JandoK

JandoK

    Advanced Member

  • Moderadores
  • PipPipPip
  • 838 mensajes
  • LocationMexico

Escrito 10 abril 2010 - 09:55

Bueno dias...
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!!!!!!!
  • 0

#2 eduarcol

eduarcol

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.483 mensajes
  • LocationVenezuela

Escrito 10 abril 2010 - 12:01

Si estas en firebird yo lo haria con un sp donde comparo el registro actual con el valor anterior si se cumple la condicion lo devuelvo en el parametro de salida.
  • 0

#3 JandoK

JandoK

    Advanced Member

  • Moderadores
  • PipPipPip
  • 838 mensajes
  • LocationMexico

Escrito 10 abril 2010 - 12:57

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!!!!!!!
  • 0

#4 eduarcol

eduarcol

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.483 mensajes
  • LocationVenezuela

Escrito 10 abril 2010 - 04:32

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
  • 0

#5 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 11 abril 2010 - 09:23

¿ Que te parece algo así ?



sql
  1. SELECT id AS id_inicial
  2.         (SELECT FIRST 1 siguiente.id FROM tabla siguiente WHERE siguiente.id > inicial.id ORDER BY siguiente.id) AS id_siguiente,
  3.         fecha AS fecha_inicial,
  4.         (SELECT FIRST 1 siguiente.fecha FROM tabla siguiente WHERE siguiente.id > inicial.id ORDER BY siguiente.id) AS fecha_siguiente,
  5.         peso AS peso_inicial,
  6.         (SELECT FIRST 1 siguiente.peso FROM tabla siguiente WHERE siguiente.id > inicial.id ORDER BY siguiente.id) AS peso_siguiente,
  7. FROM tabla inicial
  8. 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))
  9. ORDER BY id



Saludos.
  • 0

#6 JandoK

JandoK

    Advanced Member

  • Moderadores
  • PipPipPip
  • 838 mensajes
  • LocationMexico

Escrito 11 abril 2010 - 10:02

hola..
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!!!!!!!
  • 0

#7 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 11 abril 2010 - 01:52

Hola.

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.
  • 0

#8 JandoK

JandoK

    Advanced Member

  • Moderadores
  • PipPipPip
  • 838 mensajes
  • LocationMexico

Escrito 11 abril 2010 - 02:10

lo que no se o no entiendo, es para que sirve  o cual es la funcion que realiza ese  FIRST 1  ???

gracias...

salu2!!!!!!!
  • 0

#9 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 11 abril 2010 - 02:14

Es para devolver un único registro.

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.
  • 0

#10 JandoK

JandoK

    Advanced Member

  • Moderadores
  • PipPipPip
  • 838 mensajes
  • LocationMexico

Escrito 11 abril 2010 - 02:23

haaa.  haaa..  ya entendi  jejej 
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!!!!!!!
  • 0

#11 JandoK

JandoK

    Advanced Member

  • Moderadores
  • PipPipPip
  • 838 mensajes
  • LocationMexico

Escrito 11 abril 2010 - 03:49

Hola...
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...



sql
  1. SELECT id AS id_inicial, id_usuario,
  2.         (SELECT siguiente.id FROM produccion siguiente WHERE siguiente.id > inicial.id AND id_usuario = 1 ORDER BY siguiente.id LIMIT 1 ) AS id_siguiente,
  3.         fecha AS fecha_inicial,
  4.         (SELECT siguiente.fecha FROM produccion siguiente WHERE siguiente.id > inicial.id AND id_usuario = 1 ORDER BY siguiente.id LIMIT 1 ) AS fecha_siguiente,
  5.         peso AS peso_inicial,
  6.         (SELECT siguiente.peso FROM produccion siguiente WHERE siguiente.id > inicial.id AND id_usuario = 1 ORDER BY siguiente.id LIMIT 1 ) AS peso_siguiente
  7. FROM produccion inicial
  8. 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')
  9. ORDER BY id



Gracias...

Salu2!!!!!!!
  • 0