Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

[SOLUCIONADO] Consulta Devolver máximo registro (Llave compuesta)

Estas en el tema de Consulta Devolver máximo registro (Llave compuesta) en el foro de SQL Server en Foros del Web. Buen día: Tengo una consulta que la verdad no he podido solucionar. Tengo una tabla de datos TBL_ACTOS , la cual tiene 3 columnas: seqFormulario, ...
  #1 (permalink)  
Antiguo 07/04/2016, 04:36
 
Fecha de Ingreso: abril-2016
Mensajes: 3
Antigüedad: 8 años
Puntos: 0
Consulta Devolver máximo registro (Llave compuesta)

Buen día:

Tengo una consulta que la verdad no he podido solucionar.

Tengo una tabla de datos TBL_ACTOS , la cual tiene 3 columnas: seqFormulario, numActo y fchActo,
la idea es sacar por cada seqFormulario la mayor fecha y resolucion, es posible que en una misma fecha haya mas de una resolucion, la siguiente imagen tiene unos datos de la tabla TBL_ACTOS y la otra tabla refleja la salida que se necesita.

  #2 (permalink)  
Antiguo 07/04/2016, 07:49
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta Devolver máximo registro (Llave compuesta)

Sencillo, solamente ocupas hacer un subquery donde obtengas el maximo de cada fecha agrupado por seq_formulario y hagas un left join con la misma tabla para obtener lo que necesitas ;)................................................ ........


Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. seq_formulario INT,
  4. numacto INT,
  5. fchActo datetime
  6. )
  7.  
  8.  
  9. INSERT INTO #temp VALUES (1,18,'2010-07-22')
  10. INSERT INTO #temp VALUES (1,4,'2015-05-29')
  11. INSERT INTO #temp VALUES (1,22,'2009-06-30')
  12. INSERT INTO #temp VALUES (2,3,'2015-01-28')
  13. INSERT INTO #temp VALUES (2,5,'2009-06-30')
  14. INSERT INTO #temp VALUES (3,8,'2014-07-14')
  15. INSERT INTO #temp VALUES (3,16,'2009-08-03')
  16.  
  17.  
  18.  
  19. SELECT t1.* FROM #temp AS t1
  20. LEFT JOIN (SELECT seq_formulario, MAX(fchActo) fecha FROM #temp GROUP BY seq_formulario) AS t2 ON (t1.seq_formulario=t2.seq_formulario AND t1.fchActo=t2.fecha)
  21. WHERE t2.seq_formulario IS NOT NULL
  22. ORDER BY seq_formulario ASC

Resultado:

seq_formulario numacto fchActo
1 4 2015-05-29 00:00:00.000
2 3 2015-01-28 00:00:00.000
3 8 2014-07-14 00:00:00.000
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 07/04/2016, 08:06
 
Fecha de Ingreso: junio-2011
Mensajes: 289
Antigüedad: 12 años, 10 meses
Puntos: 15
Respuesta: Consulta Devolver máximo registro (Llave compuesta)

Otra opción planteada por el mismo @Libras

LINK


Sería


Código SQL:
Ver original
  1. SELECT * FROM TBL_ACTOS WHERE
  2. CONVERT(VARCHAR(20),fchActo) + '#' + CONVERT(VARCHAR(20),seqFormulario)  IN
  3.     (
  4.     SELECT CONVERT(VARCHAR(20),MAX(fchActo)) + '#' + CONVERT(VARCHAR(20),seqFormulario) FROM TBL_ACTOS GROUP BY seqFormulario
  5.     )

Solo creas una llave para buscar con un IN...

Aun que si son demasiados registros claramente el LEFT JOIN no tiene comparación con el IN xD
  #4 (permalink)  
Antiguo 07/04/2016, 08:18
 
Fecha de Ingreso: abril-2016
Mensajes: 3
Antigüedad: 8 años
Puntos: 0
Respuesta: Consulta Devolver máximo registro (Llave compuesta)

Gracias por la ayuda prestada!

En efecto funciona, pero existe el caso que comentaba que si un formulario en una fecha presenta mas de una resolucion, se debe devolver el mayor numActo, como en el seqFormulario 4 donde la mayor fecha es 2015-02-24, debe devolver para el caso el numActo 5.

Agradezco la ayuda que me pueda prestar.
  #5 (permalink)  
Antiguo 07/04/2016, 08:34
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta Devolver máximo registro (Llave compuesta)

Ok no revise la parte donde dices que si hay mas de un registro en la misma fecha tome en cuenta el numero maximo de la otra columna, bueno para ese caso solamente agregamos un max al query que ya teniamos y listo ;)


Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. seq_formulario INT,
  4. numacto INT,
  5. fchActo datetime
  6. )
  7.  
  8.  
  9. INSERT INTO #temp VALUES (1,18,'2010-07-22')
  10. INSERT INTO #temp VALUES (1,4,'2015-05-29')
  11. INSERT INTO #temp VALUES (1,22,'2009-06-30')
  12. INSERT INTO #temp VALUES (2,3,'2015-01-28')
  13. INSERT INTO #temp VALUES (2,5,'2009-06-30')
  14. INSERT INTO #temp VALUES (3,8,'2014-07-14')
  15. INSERT INTO #temp VALUES (3,16,'2014-07-14')
  16. INSERT INTO #temp VALUES (3,30,'2014-07-14')
  17.  
  18.  
  19. SELECT seq_formulario, MAX(numacto) AS num, MAX(fchActo) AS fecha FROM(
  20. SELECT t1.* FROM #temp AS t1
  21. INNER JOIN (SELECT seq_formulario, MAX(fchActo) fecha FROM #temp GROUP BY seq_formulario
  22. ) AS t2 ON (t1.seq_formulario=t2.seq_formulario AND t1.fchActo=t2.fecha)
  23. WHERE t2.seq_formulario IS NOT NULL
  24. ) AS completa GROUP BY seq_formulario
  25. ORDER BY seq_formulario ASC

Resultado:
seq_formulario num fecha
1 4 2015-05-29 00:00:00.000
2 3 2015-01-28 00:00:00.000
3 30 2014-07-14 00:00:00.000

Como ves tengo 3 campos con la misma fecha para el seq 3 entonces nada mas presenta el que tiene el num mas grande en este caso de ejemplo el 30 :)

ZedGe1505, el ejemplo que pones tambien funciona pero es mas eficiente usar un join en lugar de la concatenacion con el IN(si te fijas el post es del 2011 me faltaba un poco de practica y experiencia ;) jejejejeje)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 07/04/2016, 09:25
 
Fecha de Ingreso: abril-2016
Mensajes: 3
Antigüedad: 8 años
Puntos: 0
Respuesta: Consulta Devolver máximo registro (Llave compuesta)

Muchas gracias, ya lo adecué a lo que necesitaba y funcionó muy bien

Agradezco la ayuda!!

Etiquetas: devolver, llave, registro, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:55.