MySQL - mostrar 2 registros de cada tipo

 
Vista:
sin imagen de perfil
Val: 12
Ha aumentado 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

mostrar 2 registros de cada tipo

Publicado por alberto (7 intervenciones) el 05/12/2016 15:16:47
Como verán en el ejemplo tengo una lista donde los 3 primeros registros son de un mismo documento en diferente hora y fecha, lo que necesitaría es solo mostrar los 2 últimos realizados por cada documento.

DOCUMENTO Fecha Seguimiento Hora
111489 29/11/2016 6:19:39 p. m.
111489 29/11/2016 1:48:55 p. m.
111489 2/12/2016 7:31:12 p. m.
72870 29/11/2016 1:28:29 p. m.
72870 29/11/2016 6:06:49 p. m.
72870 30/11/2016 10:21:58 a. m.
72870 30/11/2016 1:51:00 p. m.
106799 29/11/2016 11:14:57 a. m.
106799 29/11/2016 6:05:14 p. m.
106799 30/11/2016 5:58:37 a. m.
106799 30/11/2016 1:53:52 p. m.
106800 30/11/2016 11:32:25 a. m.
106801 30/11/2016 11:11:20 a. m.
106798 29/11/2016 11:37:38 a. m.

he realizado la prueba con limit pero el resultado no ha sido el esperado
SELECT
monito.Fecha,
monito.Hora,
monito.documento FROM
anmonitoreo AS monito
ORDER BY
monito.Fecha DESC

agradezco su colaboracion
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
sin imagen de perfil
Val: 201
Bronce
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

mostrar 2 registros de cada tipo

Publicado por Rafael (97 intervenciones) el 07/12/2016 09:16:26
Lo primero es saber la posición del registro para cada documento, esto lo puedes obtener calculando un campo:

1
2
3
4
5
6
7
8
9
10
11
SELECT monito.Fecha
     , monito.Hora
	 , monito.documento
	 , @last_doc as doc_Previo
	 , (CASE WHEN @last_doc != monito.documento THEN @cont:=1
	         ELSE @cont:=@cont+1 END) as posicion
	 , @last_doc:=monito.documento as doc_Actual
FROM   anmonitoreo monito
     , (SELECT @cont:=0
	         , @last_doc:=null) as r
ORDER BY monito.documento, monito.Fecha DESC, monito.Hora DESC

Que hago aquí???
Evaluó por cada registro si el documento anterior es igual al actual, si no es significa que acabo de cambiar de documento por lo que la posición es 1, si es el mismo es el sumo uno a la posición.

Aquí cabe acotar que el orden debe ser el que implica tu enunciado, solo los dos últimos de cada documento, así pues ordenamos por documento, fecha descendente y hora descendente.

Una vez que sabemos la posición podemos limitar el resultado:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT SQ.Fecha
     , SQ.Hora
	 , SQ.documento
FROM   (SELECT monito.Fecha
			 , monito.Hora
			 , monito.documento
			 , @last_doc as doc_Previo
			 , (CASE WHEN @last_doc != monito.documento THEN @cont:=1
					 ELSE @cont:=@cont+1 END) as posicion
			 , @last_doc:=monito.documento as doc_Actual
		FROM   anmonitoreo monito
			 , (SELECT @cont:=0
					 , @last_doc:=null) as r
		ORDER BY monito.documento, monito.Fecha DESC, monito.Hora DESC) SQ
WHERE  SQ.posicion < 3
ORDER  BY SQ.Fecha DESC;

Y obviamente ordenar por fecha como queríamos al principio...

Saludos
Pd. Si la información te sirve a mi me sirve un +1
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 12
Ha aumentado 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

mostrar 2 registros de cada tipo

Publicado por alberto (7 intervenciones) el 07/12/2016 15:27:08
muchas gracias, me funciono perfecto
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