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

obtener ID mayor y otras columnas en una tabla historica

Estas en el tema de obtener ID mayor y otras columnas en una tabla historica en el foro de SQL Server en Foros del Web. saludos a tod@s. tengo una tabla donde se guarda el historico de los registros. la estructura tiene un ID identity, un campo Folio, y otros ...
  #1 (permalink)  
Antiguo 16/01/2012, 11:38
 
Fecha de Ingreso: agosto-2004
Mensajes: 296
Antigüedad: 20 años, 3 meses
Puntos: 0
obtener ID mayor y otras columnas en una tabla historica

saludos a tod@s.

tengo una tabla donde se guarda el historico de los registros. la estructura tiene un ID identity, un campo Folio, y otros campos como Precio1. Ejemplo

ID Folio Precio1
1 558 390.00
2 392 300.00
3 558 400.00
4 190 210.00
5 190 300.00
6 392 280.00

y lo que necesito es obtener en un solo query, los mas recientes, es decir asi:

ID Folio Precio1
3 558 400.00
5 190 300.00
6 392 280.00

recuerdo que habia una instruccion para hacer subconsultas sobre la misma tabla en el mismo query, pero no recuerdo cual es.

espero pueda ayudarme... saludos y muchas gracias.
  #2 (permalink)  
Antiguo 16/01/2012, 11:53
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 11 meses
Puntos: 38
Respuesta: obtener ID mayor y otras columnas en una tabla historica

Código:

SELECT *
FROM    MiTabla
WHERE ID IN (
            SELECT MAX(ID)
            FROM    MiTabla
            GROUP BY FOLIO
)

Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #3 (permalink)  
Antiguo 19/01/2012, 12:28
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: obtener ID mayor y otras columnas en una tabla historica

No me gusta mucho el IN, por su lentitud.

Código SQL:
Ver original
  1. SELECT *
  2. FROM    MiTabla a
  3. WHERE EXISTS (
  4.             SELECT MAX(ID)
  5.             FROM    MiTabla b
  6.             WHERE a.ID = b.ID
  7.             GROUP BY FOLIO
  8. )
__________________
MCTS Isaias Islas
  #4 (permalink)  
Antiguo 19/01/2012, 13:02
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 11 meses
Puntos: 38
Respuesta: obtener ID mayor y otras columnas en una tabla historica

Sin animo de hacer grilla..es solo me gusta hacer comparaciones y me parecio buena idea tu propuesta asi que decidi hacer unas pruebitas, y bueno aqui se los comparto..

--

Me parecio excelente cuando tome ambas consultas y compare los planes estimados de execucion...

Me aparecio una mejora de 20 % vs 80% del EXISTS e IN respectivamente..

Pero ya viendolo bien.. la del EXISTS es una consulta diferente y por ende retorna resultados diferentes ...

Esta seria la consulta equivalente utilizando el EXISTS..

Código:
    SELECT *
    FROM    MiTabla a
    WHERE EXISTS (
                SELECT MAX(ID)
                FROM    MiTabla b
                GROUP BY FOLIO
                HAVING MAX(ID) = a.id
    )
Y asi ambos querys me generaron exactamente el mismo plan estimado de ejecucion..con el 50 - 50 % de tiempo para ambos casos..


En la practica, a mi me ha resultado indistinto tomar uno o el otro..

En fin..solo un comentario..





Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #5 (permalink)  
Antiguo 19/01/2012, 14:45
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: obtener ID mayor y otras columnas en una tabla historica

Interesante el comentario de Andres95.

Hay una tercer forma de obtener este mismo resultado. hace algún tiempo tuve la oportunidad de probarlo en MySQL y resultó ser el más eficiente de los tres, sería interesante que Andres95 lo repitiera en el equipo donde hizo las pruebas anteriores para ver si también en SQL server resulta o no más eficiente que EXISTS e IN. La consulta utiliza un INNER JOIN:

Código SQL:
Ver original
  1. DECLARE @Tabla TABLE (ID INT, Folio INT, Precio1 NUMERIC(8,2));
  2. INSERT INTO @tabla VALUES (1, 558, 390.00);
  3. INSERT INTO @tabla VALUES (2, 392, 300.00);
  4. INSERT INTO @tabla VALUES (3, 558, 400.00);
  5. INSERT INTO @tabla VALUES (4, 190, 210.00);
  6. INSERT INTO @tabla VALUES (5, 190, 300.00);
  7. INSERT INTO @tabla VALUES (6, 392, 280.00);
  8.  
  9. SELECT T1.id, T1.folio, T1.Precio1 FROM @Tabla T1 INNER JOIN
  10. (SELECT folio, MAX(id) max_id FROM @tabla GROUP BY folio) T2
  11. ON T1.id = T2.max_id AND T1.folio = T2.folio
  12. ORDER BY T1.id

Faltaría el tema de los índices, por eso le pido de favor a Andres95 que pruebe bajo las mismas condiciones las tres consultas.

Saludos
Leo.
  #6 (permalink)  
Antiguo 19/01/2012, 15:35
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: obtener ID mayor y otras columnas en una tabla historica

Habria que probar con una buena cantidad de registros y asi obtendremos la buenas recomendaciones de Microsoft
__________________
MCTS Isaias Islas

Etiquetas: columnas, mayor, registro, tabla, campos
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 13:37.