Resultados 1 al 16 de 16

Tema: Ayuda Query SQL

  1. #1
    Pajarito Nuevo Avatar de -Cygnus-
    Fecha de ingreso
    16 abr, 08
    Mensajes
    81

    Ayuda Query SQL

    Hola a todos, tengo la siguiente duda (MySQL).Tengo la sigiente tabla

    Tabla1:
    Campos:
    ID-Fase-Nombre-Tiempo
    1-Uno-Carlos Santana - 18:00
    2-Uno-Carlos Santana - 18:05
    3-Dos-Carlos Santana - 18:10
    1-Uno-Carlos Perez - 18:00
    2-Uno-Carlos Perez - 18:05
    3-Uno-Carlos Perez - 18:07
    4-Dos-Carlos Perez - 18:20


    Lo que necesito sacar es la diferencia de tiempo entre Uno(inicial) y Dos de una persona, a veces hay muchos mas Uno en fase.

    Lo que deberia obtener es:
    1 Carlos Santana 00:05
    2 Carlos Perez 00:13

    Update:
    La ayuda de VJ en su momento me ayudo mucho (La adjunto)

    SELECT ti.Nombre, TIMEDIFF(tf.t, ti.t) as delta_t
    FROM
    (SELECT max(Tiempo) as t, Nombre
    FROM fases
    WHERE FASE = 'Uno'
    GROUP BY Nombre) as ti INNER JOIN
    (SELECT min(Tiempo) as t, Nombre
    FROM fases
    WHERE FASE = 'Dos'
    GROUP BY Nombre) as tf
    ON ti.Nombre = tf.Nombre

    Mi problema y que en su minuto no me fije, es el siguiente

    Al sacar el tiempo minimo en la fase 2 en ciertos casos ocurre el siguiente problema:

    1-Pepito Fase1 10/10/2012 23:00
    2-Pepito Fase2 10/10/2012 23:05
    3-Pepito Fase2 11/10/2012 00:04

    Nota la columna de fecha y hora son distintas

    Lo que me muestra tiempo negativo siendo que me deberia mostrar 00:05. Existe alguna forma que no genere un gran costo arreglar este problema?.

    Saludos.
    Última edición por -Cygnus-; 08/11/2012 a las 10:28 Razón: Update
    Laptop Dell XPS M1530:
    Color Tuxedo Black Casing XPS / XPS M1530, Intel Core 2 Duo Processor T7500 (2.2GHz/800MhzFSB, 4M L2 Cache) / 4GB, DDR2, 667MHz 2 Dimm / 200G 7200RPM SATA Hard Drive Free Fall Sensor / 256MB NVIDIA GeForce 8600M GT / 15.4 inch Black Wide Screen WXGA TrueLife LCD with 2.0 MP Camera for XPS M1530 / Integrated Bluetooth / 6 Cell battery /Sound Blaster Audigy / 3 Years Complete Care / Mouse Bluetooth Dell Travel /

  2. #2
    Alo Avatar de glinduff
    Fecha de ingreso
    17 mar, 06
    Mensajes
    31
    Y en fase Dos hay solo uno?. Lo que necesitas es la diferencia de tiempo entre Uno (inicial) y Dos (unico tiempo)?

    Enviado desde mi GT-I9100 usando Tapatalk

  3. #3
    Guru
    Avatar de Raikonen
    Fecha de ingreso
    28 sep, 04
    Ubicación
    En la Tierra de Campeones
    Mensajes
    9,711

    Re: Ayuda Query SQL

    el tiempo está como tiempo o string?

  4. #4
    Pajarito Nuevo Avatar de -Cygnus-
    Fecha de ingreso
    16 abr, 08
    Mensajes
    81

    Re: Ayuda Query SQL

    @glinduff Para este caso si, en realidad no es solo un dos, pero yo me la puedo ingeniar después

    @Raikonen Es un tipo de dato tiempo.

    Muchas gracias por su tiempo!!

    Saludos
    Laptop Dell XPS M1530:
    Color Tuxedo Black Casing XPS / XPS M1530, Intel Core 2 Duo Processor T7500 (2.2GHz/800MhzFSB, 4M L2 Cache) / 4GB, DDR2, 667MHz 2 Dimm / 200G 7200RPM SATA Hard Drive Free Fall Sensor / 256MB NVIDIA GeForce 8600M GT / 15.4 inch Black Wide Screen WXGA TrueLife LCD with 2.0 MP Camera for XPS M1530 / Integrated Bluetooth / 6 Cell battery /Sound Blaster Audigy / 3 Years Complete Care / Mouse Bluetooth Dell Travel /

  5. #5
    Guru
    Avatar de Raikonen
    Fecha de ingreso
    28 sep, 04
    Ubicación
    En la Tierra de Campeones
    Mensajes
    9,711

    Re: Ayuda Query SQL

    Se me ocurre hacer un enmascaramiento, luego pasar todo a segundo,hacesla resta y luego todo a minuto si quieres.

  6. #6
    Guru
    Avatar de Cosme
    Fecha de ingreso
    27 feb, 05
    Ubicación
    Santiago
    Mensajes
    8,296

    Re: Ayuda Query SQL

    y con un case? cuantos registos son como para meter una subquery? y porque el ID se repite?.



  7. #7
    Pajarito Nuevo Avatar de -Cygnus-
    Fecha de ingreso
    16 abr, 08
    Mensajes
    81

    Re: Ayuda Query SQL

    Son 15 millones de registros aproximadamente.
    Y el ID se repite porque es un seguimiento de usuario.

    ---------- Post added at 12:18 ---------- Previous post was at 12:01 ----------

    Cita Iniciado por Raikonen Ver mensaje
    Se me ocurre hacer un enmascaramiento, luego pasar todo a segundo,hacesla resta y luego todo a minuto si quieres.

    A que te refieres con enmascaramiento?. Lo que mas me complica es que al ser un alto volumen de datos todos tienen diferente numero de fases, entonces poder seleccionar las 2 que necesito por persona se me dificulta. La resta ya es algo trivial.

    Saludos!
    Última edición por -Cygnus-; 31/05/2012 a las 12:20
    Laptop Dell XPS M1530:
    Color Tuxedo Black Casing XPS / XPS M1530, Intel Core 2 Duo Processor T7500 (2.2GHz/800MhzFSB, 4M L2 Cache) / 4GB, DDR2, 667MHz 2 Dimm / 200G 7200RPM SATA Hard Drive Free Fall Sensor / 256MB NVIDIA GeForce 8600M GT / 15.4 inch Black Wide Screen WXGA TrueLife LCD with 2.0 MP Camera for XPS M1530 / Integrated Bluetooth / 6 Cell battery /Sound Blaster Audigy / 3 Years Complete Care / Mouse Bluetooth Dell Travel /

  8. #8
    Guru
    Avatar de Raikonen
    Fecha de ingreso
    28 sep, 04
    Ubicación
    En la Tierra de Campeones
    Mensajes
    9,711

    Re: Ayuda Query SQL

    Obtener esos 2 valoreses facil.

    Siendo una BD bien construida, tendras una tabla con usuarios, a cada uni le haces un min time y max time, si es q el valor tiempo se llamara time.

  9. #9
    Moderador

    Moderador
    Avatar de [VJ]
    Fecha de ingreso
    09 ene, 06
    Ubicación
    Santiago, Chile
    Mensajes
    10,254

    Re: Ayuda Query SQL

    Asumiendo que :


    • Es una tabla llamada "fases"
    • Los nombres son únicos
    • Siempre hay algún registro de fase "Uno" y "Dos" para los registros que te interesan
    • Es en MySQL (por la función TIMEDIFF)

    Esto funciona


    Código:
    SELECT ti.Nombre, TIMEDIFF(tf.t, ti.t) as delta_t
    FROM
    (SELECT min(Tiempo) as t, Nombre
    FROM fases
    WHERE FASE = 'Uno'
    GROUP BY Nombre) as ti INNER JOIN
    (SELECT min(Tiempo) as t, Nombre
    FROM fases
    WHERE FASE = 'Dos'
    GROUP BY Nombre) as tf
    ON ti.Nombre = tf.Nombre
    Ojo que use "min" para los tiempos de la fase "Dos", quizas sea un max, pero no especificaste.
    Última edición por [VJ]; 01/06/2012 a las 00:53


    Cotiza tu notebook en SoloNotebooks

    Arma tu tarro en SoloHardware

    Encuentra tu nuevo LCD/LED en SoloElectro


  10. #10
    Pajarito Nuevo Avatar de -Cygnus-
    Fecha de ingreso
    16 abr, 08
    Mensajes
    81

    Re: Ayuda Query SQL

    Muchas gracias VJ!!!!. No fui tan especifico porque lo trate de dejar lo mas simplificado posible para ver la lógica a nivel macro. Lo que me dejaste es una guía a seguir que me sirve mucho!!!.

    Muchas gracias por tu amabilidad.

    Saludos.
    Laptop Dell XPS M1530:
    Color Tuxedo Black Casing XPS / XPS M1530, Intel Core 2 Duo Processor T7500 (2.2GHz/800MhzFSB, 4M L2 Cache) / 4GB, DDR2, 667MHz 2 Dimm / 200G 7200RPM SATA Hard Drive Free Fall Sensor / 256MB NVIDIA GeForce 8600M GT / 15.4 inch Black Wide Screen WXGA TrueLife LCD with 2.0 MP Camera for XPS M1530 / Integrated Bluetooth / 6 Cell battery /Sound Blaster Audigy / 3 Years Complete Care / Mouse Bluetooth Dell Travel /

  11. #11
    Guru
    Avatar de Cosme
    Fecha de ingreso
    27 feb, 05
    Ubicación
    Santiago
    Mensajes
    8,296

    Re: Ayuda Query SQL

    Cita Iniciado por [VJ] Ver mensaje
    Asumiendo que :


    • Es una tabla llamada "fases"
    • Los nombres son únicos
    • Siempre hay algún registro de fase "Uno" y "Dos" para los registros que te interesan
    • Es en MySQL (por la función TIMEDIFF)

    Esto funciona


    Código:
    SELECT ti.Nombre, TIMEDIFF(tf.t, ti.t) as delta_t
    FROM
    (SELECT min(Tiempo) as t, Nombre
    FROM fases
    WHERE FASE = 'Uno'
    GROUP BY Nombre) as ti INNER JOIN
    (SELECT min(Tiempo) as t, Nombre
    FROM fases
    WHERE FASE = 'Dos'
    GROUP BY Nombre) as tf
    ON ti.Nombre = tf.Nombre
    Ojo que use "min" para los tiempos de la fase "Dos", quizas sea un max, pero no especificaste.
    Pero el amigo dijo que la tabla tiene millones de registros, y no explico el esquema: no sabemos si hay indices como para acelerar la consulta. Hacer un group by a un campo varchar va a salir recontra caro.

    y tirar un where a fase que al parecer es varchar, tambien seria re caro.

    asi que caro x caro = exponencialmente lento



  12. #12
    Moderador

    Moderador
    Avatar de [VJ]
    Fecha de ingreso
    09 ene, 06
    Ubicación
    Santiago, Chile
    Mensajes
    10,254

    Re: Ayuda Query SQL

    Cita Iniciado por Cosme Ver mensaje
    Pero el amigo dijo que la tabla tiene millones de registros, y no explico el esquema: no sabemos si hay indices como para acelerar la consulta. Hacer un group by a un campo varchar va a salir recontra caro.

    y tirar un where a fase que al parecer es varchar, tambien seria re caro.

    asi que caro x caro = exponencialmente lento
    Yo diría que es caro + caro no mas, no me bajes tanto la autoestima XD

    Si los nombres de las fases están guardados en otra tabla es directo cambiar los "Uno" y "Dos" por los ID correspondientes.

    Lo mismo con el Group By, si además se tiene el "id" de la persona entonces es preferible agrupar por ese valor, pero en esencia la consulta no cambia:

    1. Encontrar los tiempos de inicio mínimos para cada persona
    2. Encontrar los tiempos de fin mínimos (o máximos?) para cada persona
    3. Hacerles un join calcular el delta

    No se me ocurre otra forma natural del hacerlo


    Cotiza tu notebook en SoloNotebooks

    Arma tu tarro en SoloHardware

    Encuentra tu nuevo LCD/LED en SoloElectro


  13. #13
    Pajarito Nuevo Avatar de -Cygnus-
    Fecha de ingreso
    16 abr, 08
    Mensajes
    81

    Re: Ayuda Query SQL

    Update
    Laptop Dell XPS M1530:
    Color Tuxedo Black Casing XPS / XPS M1530, Intel Core 2 Duo Processor T7500 (2.2GHz/800MhzFSB, 4M L2 Cache) / 4GB, DDR2, 667MHz 2 Dimm / 200G 7200RPM SATA Hard Drive Free Fall Sensor / 256MB NVIDIA GeForce 8600M GT / 15.4 inch Black Wide Screen WXGA TrueLife LCD with 2.0 MP Camera for XPS M1530 / Integrated Bluetooth / 6 Cell battery /Sound Blaster Audigy / 3 Years Complete Care / Mouse Bluetooth Dell Travel /

  14. #14
    Moderador

    Moderador
    Avatar de [VJ]
    Fecha de ingreso
    09 ene, 06
    Ubicación
    Santiago, Chile
    Mensajes
    10,254

    Re: Ayuda Query SQL

    De que tipo es cada columna? LA fecha es DATE y la hora es TIME?


    Cotiza tu notebook en SoloNotebooks

    Arma tu tarro en SoloHardware

    Encuentra tu nuevo LCD/LED en SoloElectro


  15. #15
    Pajarito Nuevo Avatar de -Cygnus-
    Fecha de ingreso
    16 abr, 08
    Mensajes
    81

    Re: Ayuda Query SQL

    Así es la fecha es DATE, hora TIME, esta query va en medio de un proceso súper grande por eso las restricciones que coloque.

    Muchas gracias de ante mano
    Laptop Dell XPS M1530:
    Color Tuxedo Black Casing XPS / XPS M1530, Intel Core 2 Duo Processor T7500 (2.2GHz/800MhzFSB, 4M L2 Cache) / 4GB, DDR2, 667MHz 2 Dimm / 200G 7200RPM SATA Hard Drive Free Fall Sensor / 256MB NVIDIA GeForce 8600M GT / 15.4 inch Black Wide Screen WXGA TrueLife LCD with 2.0 MP Camera for XPS M1530 / Integrated Bluetooth / 6 Cell battery /Sound Blaster Audigy / 3 Years Complete Care / Mouse Bluetooth Dell Travel /

  16. #16
    Moderador

    Moderador
    Avatar de [VJ]
    Fecha de ingreso
    09 ene, 06
    Ubicación
    Santiago, Chile
    Mensajes
    10,254

    Re: Ayuda Query SQL

    Código:
    SELECT ti.Nombre, TIMEDIFF(tf.t, ti.t) as delta_t FROM 
    (SELECT max(ADDTIME(Fecha, Tiempo)) as t, Nombre FROM fases WHERE FASE = 'Fase1' GROUP BY Nombre) as ti 
    INNER JOIN 
    (SELECT min(ADDTIME(Fecha, Tiempo)) as t, Nombre FROM fases WHERE FASE = 'Fase2' GROUP BY Nombre) as tf 
    ON ti.Nombre = tf.Nombre;
    Ojo que aun no estoy muy seguro si quieres "max" o "min" en las subconsultas.

    Tambien considera el tema del desempeño que te mencionaron antes, hacer group bys y wheres con strings no es eficiente.


    Cotiza tu notebook en SoloNotebooks

    Arma tu tarro en SoloHardware

    Encuentra tu nuevo LCD/LED en SoloElectro


Etiquetas para este tema

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •  
*