MySQL - como utilizar MAX en una consulta

 
Vista:
sin imagen de perfil

como utilizar MAX en una consulta

Publicado por Raidel (3 intervenciones) el 11/05/2015 18:59:19
Tengo la siguiente tabla:

tabla
Y quiero obtener de cada paciente(identificado por idPaciente), la tupla donde tenga el campo fechaHoraInficacion más reciente. Para eso hago la siguiente consulta:
SELECT MAX(fechaHoraIndicacion) AS fechaHoraIndicacion,idPaciente, estado, imb_reportepaciente.evacuacion AS evacuacion
FROM ( imb_reportepaciente)
GROUP BY imb_reportepaciente.idPaciente

La respuesta que obtengo es por ejemplo:del paciente con idPaciente = 10, la fecha = 2015-4-23 08:00:00 que está correcto, pero los campos de estado y evacuavión no son los correctos, pues me sale estado = Grave y avacuacion = si, cuando debería ser estado = MG y evacuación igual no
Gracias de antemano.
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 SuperIndio
Val: 102
Bronce
Ha aumentado 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

como utilizar MAX en una consulta

Publicado por SuperIndio (79 intervenciones) el 11/05/2015 20:27:10
a ver proba esto:

1
2
3
4
5
6
7
8
SELECT MAX( fechaHoraIndicacion ) ,
            idPaciente,
	    estado,
	    evacuacion
FROM imb_reportepaciente
GROUP BY idPaciente,
	    estado,
	    evacuacion
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
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

como utilizar MAX en una consulta

Publicado por leonardo_josue (414 intervenciones) el 11/05/2015 21:49:23
Hola Raidel:

Esta es una de las consultas más comunes en el mundo de SQL... como tal hay muchas formas de resolverla, sin embargo, una de las más utilizadas y con mejor desempeño es la utilización de JOIN's... vayamos por partes. Dado que te interesa sólo el último registro de cada idPaciente, primero obtenemos ese dato, esto lo podemos obtener así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SELECT idPaciente, MAX(fechaHoraIndicacion) max_fecha
    -> FROM imb_reportepaciente
    -> GROUP BY idPaciente;
+------------+---------------------+
| idPaciente | max_fecha           |
+------------+---------------------+
|         10 | 2014-04-23 08:00:00 |
|         14 | 2014-04-21 08:00:00 |
|         19 | 2014-04-24 13:58:14 |
|         20 | 2014-04-24 07:30:00 |
|         21 | 2014-04-24 12:17:25 |
|         22 | 2014-04-24 11:26:06 |
+------------+---------------------+
6 rows in set (0.00 sec)

Ahora, para obtener el resto de los datos, lo único que debemos hacer es FILTRAR los registros y regresar SÓLO AQUELLOS QUE SE ENCUENTRAN EN LA LISTA ANTERIOR... es decir, aquellos que tienen el mismo idPaciente y la misma fecha máxima... la forma más simple como te comenté es hacer un INNER JOIN:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> SELECT T1.*
    -> FROM imb_reportepaciente T1
    -> INNER JOIN ( SELECT idPaciente, MAX(fechaHoraIndicacion) max_fecha
    ->              FROM imb_reportepaciente
    ->              GROUP BY idPaciente ) T2
    -> ON T1.idPaciente = T2.idPaciente AND T1.fechaHoraIndicacion = T2.max_fecha;
+------+------------+----------+-----------------+---------------------+--------+
| id   | idPaciente | estado   | evaciacion      | fechaHoraIndicacion | activo|
+------+------------+----------+-----------------+---------------------+--------+
|    2 |         10 | MG       | no              | 2014-04-23 08:00:00 |      0|
|    4 |         14 | GCritico | si              | 2014-04-21 08:00:00 |      0|
|    7 |         19 | gc       | gh              | 2014-04-24 13:58:14 |      0|
|   12 |         20 | GCritico | intransportable | 2014-04-24 07:30:00 |      0|
|   44 |         21 | grave    | sanitaria       | 2014-04-24 12:17:25 |      0|
|   66 |         22 | grave    | sanitaria       | 2014-04-24 11:26:06 |      0|
+------+------------+----------+-----------------+---------------------+--------+
6 rows in set (0.00 sec)

Observa que en el INNER JOIN se usa la primer consulta, y en el ON se ponen las dos condiciones (idPaciente y fecha).

Dale un vistazo para ver si es lo que necesitas.

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