Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-10-2004
Carlex Carlex is offline
Miembro
 
Registrado: feb 2004
Ubicación: Bolivia
Posts: 88
Poder: 21
Carlex Va por buen camino
Unhappy 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
Responder Con Cita
  #2  
Antiguo 06-10-2004
jdangosto jdangosto is offline
Miembro
 
Registrado: jun 2004
Posts: 82
Poder: 20
jdangosto Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 06-10-2004
aig aig is offline
Miembro
 
Registrado: may 2003
Ubicación: España
Posts: 56
Poder: 21
aig Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 06-10-2004
[basti] basti is offline
Miembro Premium
 
Registrado: ago 2004
Posts: 388
Poder: 20
basti Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 01-12-2004
Carlex Carlex is offline
Miembro
 
Registrado: feb 2004
Ubicación: Bolivia
Posts: 88
Poder: 21
Carlex Va por buen camino
Talking

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
Responder Con Cita
  #6  
Antiguo 02-12-2004
[basti] basti is offline
Miembro Premium
 
Registrado: ago 2004
Posts: 388
Poder: 20
basti Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 25-06-2012
Karzie Karzie is offline
Registrado
NULL
 
Registrado: jun 2012
Posts: 5
Poder: 0
Karzie Va por buen camino
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,
Responder Con Cita
  #8  
Antiguo 26-06-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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
Responder Con Cita
  #9  
Antiguo 26-06-2012
Avatar de mightydragonlor
[mightydragonlor] mightydragonlor is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Medellín-Colombia
Posts: 587
Poder: 18
mightydragonlor Va por buen camino
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
__________________
mas confundido que Garavito el día del Niño.
Responder Con Cita
  #10  
Antiguo 26-06-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Pero aquí se trata de encontrar el último registro de cada grupo y no sé cómo se aplicaría lo que comentas.

// Saludos
Responder Con Cita
  #11  
Antiguo 26-06-2012
Avatar de mightydragonlor
[mightydragonlor] mightydragonlor is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Medellín-Colombia
Posts: 587
Poder: 18
mightydragonlor Va por buen camino
Cita:
Empezado por roman Ver Mensaje
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.
__________________
mas confundido que Garavito el día del Niño.
Responder Con Cita
  #12  
Antiguo 27-06-2012
Karzie Karzie is offline
Registrado
NULL
 
Registrado: jun 2012
Posts: 5
Poder: 0
Karzie Va por buen camino
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,
Responder Con Cita
  #13  
Antiguo 18-09-2018
3XJoa 3XJoa is offline
Registrado
NULL
 
Registrado: sep 2018
Posts: 1
Poder: 0
3XJoa Va por buen camino
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
Responder Con Cita
  #14  
Antiguo 18-09-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por 3XJoa Ver Mensaje
...
Bienvenido, por favor, lee nuestra guía de estilo, gracias.
Responder Con Cita
  #15  
Antiguo 24-09-2018
abelg abelg is offline
Miembro
 
Registrado: jul 2004
Posts: 50
Poder: 20
abelg Va por buen camino
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

Última edición por abelg fecha: 24-09-2018 a las 22:58:54.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 15:53:01.


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
Copyright 1996-2007 Club Delphi