Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Subconsulta para escojer el ultimo de cada registro? (https://www.clubdelphi.com/foros/showthread.php?t=14962)

Carlex 06-10-2004 08:19:25

Subconsulta para escojer el ultimo de cada registro?
 
Buenas, tengo una consulta q por mas q la pienso no encuentro la funcion q me permita, lo siguiente: tengo una serie de registros con datos comunes q varian en montos y en fechas, lo q deseo es obtener el ultimo registro de cada grupo es decir algo asi:

Tabla inicial:

CI Pagos fecha
123 50 30/10/96
123 23 31/11/96
123 45 31/12/96
436 45 30/10/96
436 96 31/11/96
436 87 31/12/96
576 63 30/10/96
576 74 31/11/96

se obtenga el siguiente resultado

CI Pagos fecha
123 45 31/12/96
436 87 31/12/96
576 74 31/11/96

el ultimo pago por cada ci, una ayuda lo unico q se me ocurre es q tendria q sea con una subconsulta...help, gracias de antemano

jdangosto 06-10-2004 10:04:52

Buenas.

Lo que comentas yo lo suelo hacer por parámetros que se le pasan a la consulta y se recojen desde un formulario. Creo que en tu caso deberías de pasar el grupo que quieres consultar.

aig 06-10-2004 10:54:23

Quizas pueda servir esto:

Select CI, max(fecha), max(pago)
From Tabla
Group By CI


Si el valor de pago es único para la fecha más alta de un CI creo que esta select debe sacar primero la máxima fecha de cada CI y después buscará el máximo pago que será único...supongo...


Saludos.

basti 06-10-2004 11:12:07

Prueba con esta consulta, como bien dices creo que la solución pasa por una subconsulta:

Código SQL [-]
  select CI, Pagos, Fecha from Tabla tbl
    where Fecha = (select Max(Fecha) from Tabla where CI = tbl.CI)

un saludo

Carlex 01-12-2004 20:05:11

Gracias basti tu ayuda me sirvio de maravillas pero luego de revisiones exite un problema:
cada CI(Carnets) tiene a su vez CP(comprobantes)y cuando un CI tiene mas de un CP solo me muestra el primero...arreglando el query:

select CI, Pagos, Fecha, CP from Tabla tbl
where Fecha = (select Max(Fecha) from Tabla where CI = tbl.CI AND CP=tbl.CP)

me vota bien los resultados, pero cuando ya son muchos registros tarda tanto q sale Tiempo de espera agotado...Esto estoy haciendo en SQL Server 2000...esta mal el codigo o como puedo optimizarlo? Muchas Gracias

basti 02-12-2004 11:48:56

Hola:

Ahora mismo no se me ocurre otra forma de consulta que te pudiese dar mejores resultados. Para acelerarlo podrías crear algún índice sobre los campos Fecha, CI y CP.

Puedes probar incluso a crear un índice compuesto por los tres campos, o uno por fecha y otro por CI + CP. Prueba a ver cual te da mejores resultados.

un saludo

Karzie 25-06-2012 23:43:57

Obtener el ultimo Registro del grupo por mayor fecha.
 
Veo que han pasado años y todavia no responde tu pregunta,

Quizas esta query te sirva:

select CI, Pagos, Fecha from Tabla tbl
where EXISTS(select CI,Max(Fecha) As Fecha from Tabla Group by CI HAVING CI = tbl.CI And Max(Fecha) = tbl.Fecha)


Saludos,

Casimiro Notevi 26-06-2012 00:18:29

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :)

Recuerda poner los tags al código fuente, ejemplo:



Gracias :)

mightydragonlor 26-06-2012 01:06:23

Lo que yo siempre hago es muy simple, hago la consulta con los filtros normales, le aplico orden descendente y sólo recibo el primer registro con:
SELECT TOP 1

roman 26-06-2012 06:14:05

Pero aquí se trata de encontrar el último registro de cada grupo y no sé cómo se aplicaría lo que comentas.

// Saludos

mightydragonlor 26-06-2012 16:49:04

Cita:

Empezado por roman (Mensaje 436016)
Pero aquí se trata de encontrar el último registro de cada grupo y no sé cómo se aplicaría lo que comentas.

// Saludos

Tienes razón roman, acá dejo como se haría:
Código Delphi [-]
SELECT DISTINCT
  CI,
  (SELECT TOP 1 Pagos FROM TABLA WHERE CI = T.CI ORDER BY Fecha Desc) AS [Ultimo Pago],
  (SELECT TOP 1 Fecha FROM TABLA WHERE CI = T.CI ORDER BY Fecha Desc) AS [Ultima Fecha]
FROM TABLA AS T

Aunque contiene 2 subconsultas, he probado esto en una base de datos que tengo, con una tabla que maneja una estructura demasiado parecida y que tiene 2'331.476 registros y se ejecuta bastante rápido, pero también es cierto que si se hace con un Group By y un Having, puede ser mas veloz la consulta.

Saludos.

Karzie 27-06-2012 21:31:58

Obtner el ultimo registro de cada grupo.
 
Solo intenta comprender la consulta que te envie anteriormente y veras que si te funciona y efectivamente es muy rapida.

Saludos,

3XJoa 18-09-2018 09:36:24

Y SI NO DESEO SELECCIONAR EL ULTIMO SI NO EL PENULTIMO

Tabla inicial:

CI Pagos fecha
123 50 30/10/96
123 23 31/11/96
123 45 31/12/96

436 45 30/10/96
436 96 31/11/96
436 87 31/12/96

576 63 30/10/96
576 74 31/11/96

se obtenga el siguiente resultado

CI Pagos fecha
123 23 31/11/96
123 23 31/11/96
576 63 30/10/96

Casimiro Notevi 18-09-2018 11:10:40

Cita:

Empezado por 3XJoa (Mensaje 528467)
...

Bienvenido, por favor, lee nuestra guía de estilo, gracias.

abelg 24-09-2018 22:50:32

Una solución prudente creo seria esta.

SQL.
Código SQL [-]
Create Table ##Pagos (
  CI int,
  Pagos int,
  Fecha DateTime
)

insert into ##Pagos Values(123, 50, convert(datetime,'30/10/1996', 103))
insert into ##Pagos Values(123, 23, convert(datetime,'30/11/1996', 103))
insert into ##Pagos Values(123, 45, convert(datetime,'31/12/1996', 103))
insert into ##Pagos Values(436, 45, convert(datetime,'30/10/1996', 103))
insert into ##Pagos Values(436, 96, convert(datetime,'30/11/1996', 103))
insert into ##Pagos Values(436, 87, convert(datetime,'31/12/1996', 103))
insert into ##Pagos Values(576, 63, convert(datetime,'30/10/1996', 103))
insert into ##Pagos Values(576, 74, convert(datetime,'30/11/1996', 103))


Select p.*
from ##Pagos p
inner join (Select CI, Max(Fecha) MaxFecha 
      From ##Pagos tp Group by tp.CI) pp on pp.CI = p.CI and p.Fecha = pp.MaxFecha


Drop Table ##Pagos


Se que es un post pasado pero puede servir a alguien.

Para el Penultimo.

Código SQL [-]
Create Table ##Pagos (
  CI int,
  Pagos int,
  Fecha DateTime
)

insert into ##Pagos Values(123, 50, convert(datetime,'30/10/1996', 103))
insert into ##Pagos Values(123, 23, convert(datetime,'30/11/1996', 103))
insert into ##Pagos Values(123, 45, convert(datetime,'31/12/1996', 103))
insert into ##Pagos Values(436, 45, convert(datetime,'30/10/1996', 103))
insert into ##Pagos Values(436, 96, convert(datetime,'30/11/1996', 103))
insert into ##Pagos Values(436, 87, convert(datetime,'31/12/1996', 103))
insert into ##Pagos Values(576, 63, convert(datetime,'30/10/1996', 103))
insert into ##Pagos Values(576, 74, convert(datetime,'30/11/1996', 103))


Select *, CAST(0 as int) IsLast
into #NewPagos
from ##Pagos


update np set np.IsLast = 2
from #NewPagos np
inner join (Select CI, Max(Fecha) MaxFecha
      from #NewPagos
      Group by CI) p on p.CI = np.CI and p.MaxFecha = np.Fecha

update np set np.IsLast = 1
from #NewPagos np
inner join (Select CI, Max(Fecha) MaxFecha
      from #NewPagos
      Where IsLast != 2
      Group by CI) p on p.CI = np.CI and p.MaxFecha = np.Fecha

--Select CI, Pagos, Fecha
--from #NewPagos

Select CI, Pagos, Fecha
from #NewPagos
Where IsLast = 1


Drop Table ##Pagos
Drop table #NewPagos


La franja horaria es GMT +2. Ahora son las 12:37:27.

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