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
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 /
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
el tiempo está como tiempo o string?
@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 /
Se me ocurre hacer un enmascaramiento, luego pasar todo a segundo,hacesla resta y luego todo a minuto si quieres.
y con un case? cuantos registos son como para meter una subquery? y porque el ID se repite?.
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 ----------
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 /
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.
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
Ojo que use "min" para los tiempos de la fase "Dos", quizas sea un max, pero no especificaste.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
Ú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
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 /
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
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 /
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
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 /
Ojo que aun no estoy muy seguro si quieres "max" o "min" en las subconsultas.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;
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