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

obtener valor maximo de una tabla

Estas en el tema de obtener valor maximo de una tabla en el foro de Bases de Datos General en Foros del Web. buenos dias, ojala puedan ayudarme con lo siguiente : tengo una tabla llamada doc con la sigiente estructura carclave noguia fec_reg destciur c-223 00000123 12/02/2011 ...
  #1 (permalink)  
Antiguo 25/02/2011, 08:25
 
Fecha de Ingreso: enero-2008
Ubicación: mexico d.f.
Mensajes: 39
Antigüedad: 16 años, 3 meses
Puntos: 0
Exclamación obtener valor maximo de una tabla

buenos dias, ojala puedan ayudarme con lo siguiente :
tengo una tabla llamada doc con la sigiente estructura

carclave noguia fec_reg destciur
c-223 00000123 12/02/2011 cancun
c-45 00000234 16/02/2011 tultitlan
c-223 00000134 14/02/2011 iztapalapa
etc

lo que necesito obtener es el registro mayor de cada carclave
he usado la sentencia siguiente

select max(noguia),carclave
from doc.db
group by doc.carclave

asi me da el ultimo noguia por cada carclave

pero necesito que tambien me ponga los otros dos campos
uso la sigiente sentencia

select max(noguia),carclave,fec_reg,destciur
from doc.db
group by doc.carclave,fec_reg,destciur,

ya que si no pongo en group by los otros dos campos me manda mensaje de error, bueno al poner asi la sentencia no pe pone el registro mayor sino me deja todos, como puedo lograr que ponga solo el ultimo pero con todos los datos de la tabla?

estoy usando un reporteador que tiene la opcion de usar sql para crear la informacion previa al reporte,

se que puedo generar una tabla nueva con los datos de ultimo noguia para cada carclave y esa unirla con la tabla doc , pero el punto es que no puedo accesar a la creacion de tablas por restricciones al sistema.

agradezco de antemano su ayuda , gracias
  #2 (permalink)  
Antiguo 25/02/2011, 09:16
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: obtener valor maximo de una tabla

Hola luisef... aquí hay dos cuestiones, una es que no nos dices de qué tipo de dato es tu campo noguia, al tener "00000123" pensaría que es un varchar, por otro lado podría considerarse que la fecha máxima para cada uno de los carclave sería el último. puedes entonces intentar dos formas:

Utilizando el campo fec_reg

Código SQL:
Ver original
  1. SELECT * FROM doc.db T1 INNER JOIN
  2. (
  3. SELECT carclave, MAX(fec_reg) max_fecha_reg FROM doc.db GROUP BY carclave
  4. ) T2 ON T1.carclave = T2.carclave AND T1.fec_reg = T2.max_fecha_reg


Utilizando el campo noguia

Código SQL:
Ver original
  1. SELECT * FROM doc.db T1 INNER JOIN
  2. (
  3. SELECT carclave, MAX(noguia) max_noguia FROM doc.db GROUP BY carclave
  4. ) T2 ON T1.carclave = T2.carclave AND T1.noguia = T2.max_noguia


En esta última sólo hay que tener cuidado en el tipo de dato, tal como te lo comenté al inicio. Si es de tipo varchar entonces tendrás que hacer la conversión a número.

Haz la prueba y nos comentas.

Saludos
Leo.
  #3 (permalink)  
Antiguo 25/02/2011, 11:27
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: obtener valor maximo de una tabla

Si es SQL tu manejador de base de datos prueba este query:


Código SQL:
Ver original
  1. SELECT * FROM (
  2. SELECT
  3. ROW_NUMBER () OVER ( PARTITION BY t1.no_guia,t1.carclave ORDER BY t1.no_guia,t1.carclave ASC) AS RN,
  4. t1.no_guia,t1.carclave,t2.fec_reg,t2.destciur FROM (
  5. SELECT MAX(noguia) no_guia,carclave
  6. FROM #temp
  7. GROUP BY carclave) t1 INNER JOIN (
  8. SELECT carclave,fec_reg,destciur FROM #temp
  9. ) t2 ON (t1.carclave=t2.carclave)
  10. )t3 WHERE rn=1

regresa:
RN no_guia carclave fec_reg destciur
1 00000134 c-223 2011-02-12 00:00:00.000 cancun
1 00000234 c-45 2011-02-16 00:00:00.000 tultitlan



Saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #4 (permalink)  
Antiguo 25/02/2011, 13:23
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: obtener valor maximo de una tabla

Hola libra:

A reserva de lo que comente luisef, autor del post, creo que hay un error en tu consulta. si checas hay dos registros para la carclave.

carclave noguia fec_reg destciur
c-223 00000123 12/02/2011 cancun
c-223 00000134 14/02/2011 iztapalapa

Según entendí, lo que que pretende es que se muestre el último de los registros entonces debería regresar el segundo de estos (que corresponde al noguia 0000134-iztapalapa)...

Igual y dejo el ejemplo en SQL Server para que le eches un vistazo. Además convendría que checaras el plan de ejecución para las consultas. Te darás cuenta que la consulta que propongo es mucho más eficiente que la que propones (aun sin definir llaves en la tabla):

Código SQL:
Ver original
  1. DECLARE @docdb TABLE (carclave VARCHAR(10), noguia VARCHAR(10), fec_reg datetime, destciur VARCHAR(50))
  2. INSERT INTO @docdb VALUES ('c-223', '00000123', '20110212', 'cancun')
  3. INSERT INTO @docdb VALUES ('c-45', '00000234', '20110216', 'tultitlan')
  4. INSERT INTO @docdb VALUES ('c-223', '00000134', '20110214', 'iztapalapa')
  5. SELECT * FROM @docdb
  6.  
  7. SELECT T1.* FROM @docdb T1 INNER JOIN
  8. (
  9. SELECT carclave, MAX(fec_reg) max_fecha_reg FROM @docdb GROUP BY carclave
  10. ) T2 ON T1.carclave = T2.carclave AND T1.fec_reg = T2.max_fecha_reg
  11.  
  12.  
  13. SELECT * FROM (
  14. SELECT
  15. ROW_NUMBER () OVER ( PARTITION BY t1.no_guia,t1.carclave ORDER BY t1.no_guia,t1.carclave ASC) AS RN,
  16. t1.no_guia,t1.carclave,t2.fec_reg,t2.destciur FROM (
  17. SELECT MAX(noguia) no_guia,carclave
  18. FROM @docdb
  19. GROUP BY carclave) t1 INNER JOIN (
  20. SELECT carclave,fec_reg,destciur FROM @docdb
  21. ) t2 ON (t1.carclave=t2.carclave)
  22. )t3 WHERE rn=1


Pero como te comento, esperemos que luisef haga los comentarios pertinentes

Saludos
Leo.
  #5 (permalink)  
Antiguo 25/02/2011, 21:47
 
Fecha de Ingreso: enero-2008
Ubicación: mexico d.f.
Mensajes: 39
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: obtener valor maximo de una tabla

gracias por responder , voy a hacer las pruebas como lo indican , leonardo en cuanto a tu respuesta no. 4 no creo que sea factible , ya que la tabla doc , contiene mas 1600 registro sy se actualiza diario, los datos mostrados son solo un ejemplo , y en efecto el dato que quisiera que apareciera en este ejemplo si son los siguientes

c-45 00000234 16/02/2011 tultitlan
c-223 00000134 14/02/2011 iztapalapa,
los t1 y t2 , supongo que son los nombres de las tablas , les informare los resultados
gracias
  #6 (permalink)  
Antiguo 25/02/2011, 21:59
 
Fecha de Ingreso: enero-2008
Ubicación: mexico d.f.
Mensajes: 39
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: obtener valor maximo de una tabla

olvide :el dato de noguia es tipo string de 8
  #7 (permalink)  
Antiguo 26/02/2011, 23:11
 
Fecha de Ingreso: enero-2008
Ubicación: mexico d.f.
Mensajes: 39
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: obtener valor maximo de una tabla

buenas noches , he intentado sus soluciones , pero me manda error de invalid keyword, quiza sea porque no supe que poner en lugar de t1 y t2 .
por otro lado tuve acceso al db32 para manipular las tablas y con estas sentencias obtengo el resultado
1. genero la primera tabla llamada car1 con los campos carclave y guia ocupo la siguiente sentencia

INSERT INTO CAR1.DB
SELECT CARCLAVE,MAX(NOGUIA)
FROM DOC.DB
GROUP BY CARCLAVE
con esto obtengo el numero de guia maximo por cada carro

2. con esta otra sentencia obtengo el resultado deseado
SELECT Car1.CLAVE, Car1.GUIA, Doc.FEC_REG,
Doc.DESTCIUR
FROM "Car1.DB" Car1 INNER JOIN "Doc.DB" Doc ON
(Doc.NOGUIA = Car1.GUIA)
AND (Doc.CARCLAVE = Car1.CLAVE)
ORDER BY Car1.CLAVE
(la tabla doc existe en la base de datos)
me da para el registro maximo de guia por carro la fecha y el destino , ahora bien esta creacion de tabla no la puedo llevar a cabo en la base de datos real, ytampoco puedo tener acceso al db32, la aplicacion esta desarrollada en delphi, y tiene el reportbuilder como generador de reportes , ahi es donde quiero generar la sentencia para obtener el dato maximo , el problema estriba en que puedo generar la consulta previa al reporte como si generara la tabla car1, pero como se manipula el sql me deshabilita los botones para enlazar esta query a la query de la tabla doc , espero no ser muy enredado

por sus aportes gracias de nuevo

Etiquetas: maximo, tablas
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 08:26.