SQL - Ayuda con consulta SQL

   
Vista:

Ayuda con consulta SQL

Publicado por Gonza (7 intervenciones) el 04/09/2013 14:47:29
Buenas,

Tengo la siguiente duda y no se como solucionarlo..

Tabla
Fecha Nombre
12/01/2013 10:10 AM Jorge
12/01/2013 10:20 AM Jorge1
12/01/2013 11:10 AM Jorge2
12/01/2013 11:20 AM Jorge3
12/01/2013 01:10 AM Jorge4
12/01/2013 01:20 AM Jorge5
13/01/2013 01:10 PM Jorge6
13/01/2013 01:20 PM Jorge7

Quisiera obtener el primer registro por hora mediante sql..

Esto querría obtener (atencion con el formato fecha y hora PM- AM!):

Fecha Nombre
12/01/2013 10:10 AM Jorge
12/01/2013 11:10 AM Jorge2
12/01/2013 01:10 AM Jorge4
13/01/2013 01:10 PM Jorge6

Probe con top 1 (obviamente no me deja porque solo me obtiene 1 registro) y podría unir tablas pero la consulta me quedaria de 15 metros si pongo cada hora y fecha del mes.

Saludos y gracias desde ya
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias Islas Gonzalez

Ayuda con consulta SQL

Publicado por Isaias Islas Gonzalez (690 intervenciones) el 04/09/2013 19:18:56
Traten, en lo posible, de comentar que MOTOR de base de datos manejan.

Si es SQL Server, consulta por MAX() y GROUP BY
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con consulta SQL

Publicado por Gonza (7 intervenciones) el 04/09/2013 19:20:38
Mediante access lo estoy haciendo..
saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con consulta SQL

Publicado por leonardo_josue (877 intervenciones) el 04/09/2013 20:52:01
Hola Gonza:

No tengo experiencia con Access se me ocurren varias formas para lo que necesitas, pongo un ejemplo de cómo sería con MySQL, sería cuestión de que encuentres la equivalencia.Partiendo de tus datos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SELECT * FROM tabla;
+---------------------+--------+
| Fecha               | Nombre |
+---------------------+--------+
| 2013-01-12 10:10:00 | Jorge  |
| 2013-01-12 10:20:00 | Jorge1 |
| 2013-01-12 11:10:00 | Jorge2 |
| 2013-01-12 11:20:00 | Jorge3 |
| 2013-01-12 01:10:00 | Jorge4 |
| 2013-01-12 01:20:00 | Jorge5 |
| 2013-01-13 13:10:00 | Jorge6 |
| 2013-01-13 13:20:00 | Jorge7 |
+---------------------+--------+
8 rows in set (0.09 sec)

al querer agrupar por hora, lo que puedes hacer es extraer SÓLO LA HORA, sin considerar los minutos, esto te daría los grupos comunes, es decir, algo como esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT DATE(fecha), HOUR(fecha), fecha
    -> FROM tabla;
+-------------+-------------+---------------------+
| DATE(fecha) | HOUR(fecha) | fecha               |
+-------------+-------------+---------------------+
| 2013-01-12  |          10 | 2013-01-12 10:10:00 |
| 2013-01-12  |          10 | 2013-01-12 10:20:00 |
| 2013-01-12  |          11 | 2013-01-12 11:10:00 |
| 2013-01-12  |          11 | 2013-01-12 11:20:00 |
| 2013-01-12  |           1 | 2013-01-12 01:10:00 |
| 2013-01-12  |           1 | 2013-01-12 01:20:00 |
| 2013-01-13  |          13 | 2013-01-13 13:10:00 |
| 2013-01-13  |          13 | 2013-01-13 13:20:00 |
+-------------+-------------+---------------------+
8 rows in set (0.00 sec)

De esta manera, puedes agrupar por estos dos campos, y con la función MIN, obtener la fecha mínima de cada hora:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT DATE(fecha), HOUR(fecha), MIN(fecha)
    -> FROM tabla
    -> GROUP BY DATE(fecha), HOUR(fecha);
+-------------+-------------+---------------------+
| DATE(fecha) | HOUR(fecha) | MIN(fecha)          |
+-------------+-------------+---------------------+
| 2013-01-12  |           1 | 2013-01-12 01:10:00 |
| 2013-01-12  |          10 | 2013-01-12 10:10:00 |
| 2013-01-12  |          11 | 2013-01-12 11:10:00 |
| 2013-01-13  |          13 | 2013-01-13 13:10:00 |
+-------------+-------------+---------------------+
4 rows in set (0.00 sec)

Finalmente, metes esto en una subconsulta y lo utilizas para filtrar tus datos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT t1.*
    -> FROM tabla T1
    -> INNER JOIN
    -> (  SELECT DATE(fecha), HOUR(fecha), MIN(fecha) min_fecha
    ->    FROM tabla
    ->    GROUP BY DATE(fecha), HOUR(fecha)) T2 ON T1.fecha = T2.min_fecha;
+---------------------+--------+
| Fecha               | Nombre |
+---------------------+--------+
| 2013-01-12 10:10:00 | Jorge  |
| 2013-01-12 11:10:00 | Jorge2 |
| 2013-01-12 01:10:00 | Jorge4 |
| 2013-01-13 13:10:00 | Jorge6 |
+---------------------+--------+
4 rows in set (0.01 sec)

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con consulta SQL

Publicado por Gonza (7 intervenciones) el 05/09/2013 15:45:41
Muchas gracias leo!
Parece que voy encaminado..

Pero me salta este error en la ultima consulta:

"Syntax error (missing operator) in query 'MIN (fecha) min_fecha'"

Si pongo: MIN(fecha) as min_fecha
Me da un mal resultado, ya que me esta repitiendo todos los datos solamente..

Que puede ser?
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con consulta SQL

Publicado por Gonza (7 intervenciones) el 05/09/2013 16:38:57
Agrego:
El "DATE(Fecha)" no funciona pero como dividí fehca y hora en 2 columnas (fecha - hora) diferentes ahora ya no es necesario, le estoy pasando directo el campo fecha, eso esta bien?

Consulta:

SELECT t1.*
FROM tabla T1
INNER JOIN
(SELECT fecha, HOUR(hora), MIN(fecha) as min_fecha
FROM tabla
GROUP BY fecha, HOUR(hora)) T2 ON T1.fecha = T2.min_fecha;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con consulta SQL

Publicado por leonardo_josue (877 intervenciones) el 05/09/2013 16:45:04
Hola de nuevo Gonza...

Como dije en mi post anterior, no tengo experiencia trabajando con ACCESS, pero de cualquier manera te sugiero que coloques la consulta que estás tratando de ejecutar, tal cual, no sólo el error que te está marcando... el colocar AS es simplemente para especificar un ALIAS de tu campo, pero en realidad no debería intervenir en nada con el resultado de la agrupación. Aquí lo interesante es ver cómo estás obteniendo las equivalencias de las funciones DATE y HOUR... por cierto, observa que yo no lo coloco ningún ALIAS a estos campos:

1
SELECT DATE(fecha), HOUR(fecha)...

Es posible que ACCESS necesite que especifiques ALIAS para todos los campos calculados, es decir, algo como esto:

1
2
3
SELECT DATE(fecha) AS fecha, HOUR(fecha) AS hora, MIN(fecha) AS min_fecha
FROM tabla
GROUP BY DATE(fecha), HOUR(fecha);

Insistiendo en que en lugar de DATE y HOUR utilices las funciones propias de ACCESS para obtener estos valores.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con consulta SQL

Publicado por Gonza (7 intervenciones) el 05/09/2013 18:09:33
Leo,

Hice con una consulta un pasaje a otra tabla diferente para que quede mas ordenado.
Ahora tengo lo siguiente:

Fecha / Hora / Nombre / Apellido
28/12/2012 8 Jose Pereira
28/12/2012 8 Federico Pereira
28/12/2012 9 Fede Psada
28/12/2012 13 Rodrigo Pperez
29/12/2012 15 Jose Peasda
29/12/2012 15 Jose Peasda

Ahora que esta un poco mas ordenado con fecha 24 horas puede ser que me sea mas facil..

Con un distinct de fecha y hora pude sacar esto:

Fecha / Hora / Nombre / Apellido
28/12/2012 8 Jose Pereira
28/12/2012 9 Fede Psada
28/12/2012 13 Rodrigo Pperez
29/12/2012 15 Jose Peasda

Luego de que tenga esto, lo que me faltaría para terminar mis dudas seria obtener los registros con diferencias de 6 horas:
Ejemplo
28/12/2012 0 Jose Pereira
28/12/2012 6 Fede Psada
28/12/2012 12 Rodrigo Pperez
28/12/2012 18 Jose Peasda

Resumen: Quiero obtener el primer registro cada seis horas

Me explique bien?
Gracias desde ya y saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar