Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Ayuda con una consulta necesaria! (https://www.clubdelphi.com/foros/showthread.php?t=83429)

daragor 17-06-2013 17:58:46

Ayuda con una consulta necesaria!
 
Hola amigos, recurro a uds. xq me encuentro sin poder encontrar la solucion a lo q necesito..

Yo tengo una tabla cargada con varios datos, supongamos movimientos de un expte.
Dentro de los datos importantes en cada registro esta el nro. de expte (o codigo unico) y el orden en que se realizó el pase.. mas alla de la fecha y otros datos q no vienen al caso.

N.exp Ord
1001 | 1
1001 | 2
1001 | 3
1002 | 1
1002 | 2
1005 | 1
1005 | 2
1005 | 3
1005 | 4
etc...

Lo que necesito es hacer una consulta que tome todos los expedientes cargados, pero solo el ultimo movimiento de cada uno! el cual esta determinado por el orden (ord).. y asi conseguir un query con esos datos. Expte y Ultimo Movimiento nada más!
Podra alguien ayudarme y decirme como se arma esa consulta, ese SELECT ? muchas gracias!

look 17-06-2013 18:43:05

Cita:

Empezado por daragor (Mensaje 462348)
Hola amigos, recurro a uds. xq me encuentro sin poder encontrar la solucion a lo q necesito..

Yo tengo una tabla cargada con varios datos, supongamos movimientos de un expte.
Dentro de los datos importantes en cada registro esta el nro. de expte (o codigo unico) y el orden en que se realizó el pase.. mas alla de la fecha y otros datos q no vienen al caso.

N.exp Ord
1001 | 1
1001 | 2
1001 | 3
1002 | 1
1002 | 2
1005 | 1
1005 | 2
1005 | 3
1005 | 4
etc...

Lo que necesito es hacer una consulta que tome todos los expedientes cargados, pero solo el ultimo movimiento de cada uno! el cual esta determinado por el orden (ord).. y asi conseguir un query con esos datos. Expte y Ultimo Movimiento nada más!
Podra alguien ayudarme y decirme como se arma esa consulta, ese SELECT ? muchas gracias!

Código SQL [-]

select 
  distinct n_exp,
 (select max(ord) from registro b where b.n_exp = b.n_exp)as ord
from 
  registro a

Casimiro Noteví 17-06-2013 19:09:31

Creo que también puedes poner algo así:

Código SQL [-]
SELECT nexp, max(ord)
FROM tbExpedientes
group by nexp

Por cierto, para otra vez procura poner un título más descriptivo a tu pregunta, gracias ;)

daragor 18-06-2013 14:41:07

Muchas gracias compañeros.. lo de casimiro q es mas simple funciona bien, pero.. tengo un problema, no puedo hacer q tome todos los datos de la tabla, solo esos 2 (nexp y ord)
QUE debo agregar para tomar todos los datos?

Gracias!
PD: casimiro no puedo editar el titulo, siempre trato de ser especifico..

Casimiro Noteví 18-06-2013 15:56:42

Creo que necesitas un simple tutorial sql ;)

Añades los campos que quieras al select. Y en el group by pones los mismos campos.

daragor 18-06-2013 16:15:10

Yo ya habia agregado todos los campos que necesito al select pero no los habia agregado al group by, xq obviamente solo quiero el orden maximo de cada expediente.. no todo..
No funciona como vos me decis casimiro.. se pierde el filtrado de "tomar solo el ord maximo"

Casimiro Noteví 18-06-2013 16:28:04

Cita:

Empezado por daragor (Mensaje 462394)
Yo ya habia agregado todos los campos que necesito al select pero no los habia agregado al group by, xq obviamente solo quiero el orden maximo de cada expediente.. no todo..
No funciona como vos me decis casimiro.. se pierde el filtrado de "tomar solo el ord maximo"

Pero pon el código que lo veamos ;)

daragor 18-06-2013 16:53:44

La primera consulta que funciona bien es asi:

Código SQL [-]
SELECT nroex,MAX(ord) FROM temp GROUP BY nroex

Esto me devuelve el nro de expediente y el orden maximo, es decir el ultimo movimiento.. (como vine explicando mas arriba)

Ahora lo q necesitaria es tomar algunos datos mas del expediente.. campos como ser asunto, fecha, folios, etc.

Si aplico como vos decis casimiro, agregando campos al select y al group by, ya no resulta el filtrado de la primera consulta.
Y si, seguro necesito afianzarme en sql, pero por eso estoy aqui solicitando ayuda..

Casimiro Noteví 18-06-2013 17:28:24

Es como he puesto antes, por eso te he dicho que pongas el código que has usado y que no te ha funcionado, para corregirlo.

Código SQL [-]
select nexp, max(ord), uncampo, otrocampo, yuncampomas
from tbExpedientes
group by nexp, uncampo, otrocampo, yuncampomas

daragor 18-06-2013 17:36:55

OK, no me funciona.. no toma el (ord) mayor.. toma todo.

Código SQL [-]
SELECT nroex,MAX(ord),asu,fec FROM temp GROUP BY nroex,asu,fec

Casimiro Noteví 18-06-2013 17:51:00

Cierto, hazlo entonces como ha indicado look

ecfisa 18-06-2013 18:15:05

Hola Daragor.

Creo que la sugerencia de look(*) hace lo que buscas, si bién se puede acelerar un poco de este modo,
Código SQL [-]
SELECT N_EXP, 
       ASUNTO,
       FECHA,
       FOLIOS,
       MAX(ORD) AS ORD
FROM TEMP T1
WHERE ORD = (SELECT MAX(ORD) FROM TEMP T2 WHERE T2.N_EXP = T1.N_EXP)
GROUP BY N_EXP, ASUNTO, FECHA, FOLIOS
ambas son consultas lentas, sobre solamente 5500 registros, la anterior(*) tardó 57.907s y esta 33.508s.

Saludos. :)

Casimiro Noteví 18-06-2013 18:23:03

Cita:

Empezado por ecfisa (Mensaje 462403)
ambas son consultas lentas, sobre solamente 5500 registros, la anterior(*) tardó 57.907s y esta 33.508s.

Muy, muy lentas.
Por eso intenté de la forma que puse antes, pero con más campos parece que no es posible, aunque tampoco me he entretenido mucho en probar.

daragor 18-06-2013 22:15:32

Hola ecfisa!! ud. como siempre poniendo claridad a los asuntos.. si, efectivamente funciona el codigo. Lo he usado y cumple, claro q es una situacion un poco complicada.. dado que aun debo filtrar por un rango de fecha y por un tipo de destino (osea un pase a un lugar determinado, no todos) pero bueno.. Muchas gracias compañero!!

RONPABLO 19-06-2013 07:39:33

y que tan lento o rápido es de esta forma??

Código SQL [-]
with t1 as(
SELECT N_EXP ,MAX(ord) as ord FROM temp GROUP BY N_EXP),

SELECT t2.N_EXP, 
       t2.ASUNTO,
       t2.FECHA,
       t2.FOLIOS,
       t1.ord
FROM TEMP t2
inner t1 on t1.N_EXP = t2.N_EXP

daragor 19-06-2013 18:09:42

RONPABLO, no tengo una base de datos con mas de 5000 registros ahora a mano para probar, seria bueno saber si optimizaste el codigo.. gracias por el aporte!


La franja horaria es GMT +2. Ahora son las 23:55:53.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi