Obtener primer y ultimo registro de un conjunto de resultados

14/11/2005 - 15:14 por Sergio Rodriguez | Informe spam
Tengo los siguientes datos:

id_docto folio nombre fecha_mod
codigo
001 10 CAS 18/01/2005 13:01 65
001 10 ALS 18/01/2005 15:20 65
001 10 CTG 19/01/2005 09:00 65
004 85 SAM 13/05/2005 09:25 65
004 85 CTG 13/05/2005 11:20 65
004 85 DFG 13/05/2005 18:54 65


Com puedo generar una consulta que me de lo siguiente:

id_docto folio UsrPrimeraMod UsrUltimaMod FechaPrimMod
FechaUltMod codigo
001 10 CAS ALS
18/01/2005 13:01 19/01/2005 09:00 65
004 85 SAM DFG
13/05/2005 09:25 13/05/2005 18:54 65

Quise ver si SQL Server tiene las funciones equivalentes en acces First y
Last para realizar la siguiente consulta:

select a.id_docto, a.folio,first(nombre) as UsrPrimeraMod, last(nombre) as
UsrUltimaMod, first(a.fecha) as FechaPrimMod, last(a.fecha) as FechaUltMod,
a.codemp
from tabla a
where codempe
group by a.id_docto,a.folio,a.codemp
order by a.id_docto,folio

Como realizarlo en SQL??

Preguntas similare

Leer las respuestas

#11 Alejandro Mesa
14/11/2005 - 18:30 | Informe spam
Sergio Rodriguez,

Me alegro que hayas podido dar con la solucion. El principio es el mismo. Yo
use vistas para hacer el codigo mas legible, pero si reemplazas la vista por
su codigo entonces quedara algo similar al tu solucion.

Quiero darte un consejo y este es que no uses la forma antigua de unir tablas:

select a.*, b.*
from a, b
where a.c1 = b.c1

y en vez de, usa la forma "ansi join".

select a.*, b.*
from a inner join b
on a.c1 = b.c1

Se que me preguntaras por que?, asi que aqui va la respuesta. Esta forma
podra ser usada en sql server 2005 solo si dejas la compatibilidad de la db
en 80 o menor y en la proxima version (despues de 2005) no podra ser usada
del todo. Ademas, hay ciertas operaciones que usando "ansi join" que no
tienen un equivalente en "join antiguo".

Ejemplo:

create table t1 (
c1 int
)
go

create table t2(
c1 int
)
go

insert into t1 values(1)
insert into t1 values(2)
go

insert into t2 values(1)
go

select t1.*
from t1 left join t2
on t1.c1 = t2.c1
where t2.c1 is null
go

select t1.*
from t1, t2
where t1.c1 *= t2.c1 and t2.c1 is null
go

drop table t1, t2
go

Como veras, ambos resultados son diferentes, principalmente porque la
segunda sentencia no refleja el filtro deseado, pues no podemos hablar de
iguadad y valores nulos al mismo tiempo.


AMB

"Sergio Rodriguez" wrote:

Gracias, lo he conseguido con la siguiente sentencia, que es basicamente la
misma idea pero sobre sentencias SQL anidadas:

SELECT ult.id_docto, ult.folio, prim.FechaPrimMod,
(select j.nombre from tabla j where prim.id_docto=j.id_docto and
prim.folio=j.folio and prim.FechaPrimMod=j.fecha) as UsrPrimMod,
ult.FechaUltMod,
(select f.nombre from tabla f where ult.id_docto=f.id_docto and
ult.folio=f.folio and ult.FechaUltMod=f.fecha) as UsrUltMod,
ult.codemp
FROM ( select a.id_docto,a.folio,min(a.fecha) as FechaPrimMod,a.codemp from
tabla a where codigo=' 945'
group by a.id_docto,a.folio,a.codemp) as Prim,

( select a.id_docto,d.descripcion,a.folio,max(a.fecha) as
FechaUltMod,a.codemp from tabla a where codigo=' 945'
group by
a.id_docto,d.descripcion,a.folio,a.depto,a.div,a.fini,a.ffin,a.codemp) as
Ult

WHERE ult.id_docto=prim.id_docto and ult.folio=prim.folio
ORDER BY ult.id_docto,ult.folio


SRD

"Alejandro Mesa" escribió en el
mensaje news:
> Sergio Rodriguez,
>
> Existen varias formas de lograr esto en sql2000, sobre todo si la tabla
> cuenta con una clave primaria. La una usando una tabla derivada o una
> vista,
> que selecciona el grupo y la funcion de agrupacion requerida por esa
> columna
> y hacer un join con la tabla en question. La otra seria usar el operador
> "not
> exists" para chequear existanecia de otras filas bajo ese criterio.
>
> Supongamos que el grupo esta formado por filas que tienen un mismo
> (id_docto, folio, Codigo)y que no existen dos filas con la misma fecha_mod
> en
> un mismo grupo, entonces:
>
> create view dbo.v1
> as
> select
> id_docto,
> folio,
> Codigo,
> min(fecha_mod) as min_fecha_mod,
> max(fecha_mod) as max_fecha_mod
> from t1
> group by id_docto, folio, Codigo
> go
>
> create view dbo.prim
> select
> a.id_docto,
> a.folio,
> a.nombre as UsrPrimMod,
> a.fecha_mod as FechaPrimMod,
> a.Codigo
> from
> t1 as a
> inner join
> v1 as b
> on a.id_docto = b.id_docto and a.folio = b.folio and a.Codigo = b.Codigo
> and a.fecha_mod = b.min_fecha_mod
>
> create view dbo.ult
> select
> a.id_docto,
> a.folio,
> a.nombre as UsrUltMod,
> a.fecha_mod as FechaUltMod,
> a.Codigo
> from
> t1 as a
> inner join
> v1 as b
> on a.id_docto = b.id_docto and a.folio = b.folio and a.Codigo = b.Codigo
> and a.fecha_mod = b.max_fecha_mod
> go
>
> select
> a.id_docto,
> a.folio,
> a.UsrPrimMod,
> a.FechaPrimMod,
> b.UsrUltMod,
> b.FechaUltMod,
> a.Codigo
> from
> dbo.prim as a
> inner join
> dbo.ult as b
> on a.id_docto = b.id_docto and a.folio = b.folio and a.Codigo = b.Codigo
> go
>
> En caso de que existan filas en un mismo grupo con la misma fecha_mod,
> entonces tendremos que usar otro metodo para poder distinguir esa filas
> unicamente. Fijate que la clave para hacer esto, es que la tabla tenga una
> clave primaria, asi que por favor si la tuya tiene una entonces dejanos
> saber
> cual es.
>
>
> AMB
>
> "Sergio Rodriguez" wrote:
>
>> El criterio es la fecha de modificacion incluye fecha y hora, eso lo
>> puedo
>> sacar mediante MAX y MIN por ese campo, pero el problema lo tengo al
>> querer
>> devolver el usuario de la primera modificacion, ya que si uso MAX o MIN
>> me
>> devuelven valor pero respecto a su orden en el alfabeto
>> En base a los ejemplos, para el folio 10 la fecha de la primera mod es
>> 18/01/2005 13:01 y el usuario que hizo la primera mod es CAS, para el
>> mismo
>> folio 10, el usuario que hizo la ultima mod es CTG el dia 19/01/2005
>> 09:00.
>> Con las fechas no tengo problema, lo tengo con los nombres de usuarios,
>> en
>> obtener el resultado que incluya
>>
>> id_docto folio UsrPrimMod FechaPrimMod UsrUltMod
>> FechaUltMod
>> Codigo
>>
>> A lo mejor el problema que tengo es querer devolver valores de diferentes
>> filas resumidos en 1
>>
>> Alguna idea que me puedan dar?
>>
>> "Alejandro Mesa" escribió en el
>> mensaje news:
>> > Sergio Rodriguez,
>> >
>> > Las fiunciones FIRST y LAST no forman parte de T-SQL, pero pueden ser
>> > simuladas si nos dices cual criterio a usar para identificar la primera
>> > y
>> > ultima fila del grupo. Chequea la sentencia "select" en los libros en
>> > linea y
>> > especialmente la parte sobre agrupacion y funciones de grupo como MIN y
>> > MAX.
>> >
>> >
>> > AMB
>> >
>> >
>> > "Sergio Rodriguez" wrote:
>> >
>> >> Tengo los siguientes datos:
>> >>
>> >> id_docto folio nombre fecha_mod
>> >> codigo
>> >> 001 10 CAS 18/01/2005 13:01
>> >> 65
>> >> 001 10 ALS 18/01/2005 15:20
>> >> 65
>> >> 001 10 CTG 19/01/2005 09:00
>> >> 65
>> >> 004 85 SAM 13/05/2005 09:25
>> >> 65
>> >> 004 85 CTG 13/05/2005 11:20
>> >> 65
>> >> 004 85 DFG 13/05/2005 18:54
>> >> 65
>> >>
>> >>
>> >> Com puedo generar una consulta que me de lo siguiente:
>> >>
>> >> id_docto folio UsrPrimeraMod UsrUltimaMod
>> >> FechaPrimMod
>> >> FechaUltMod codigo
>> >> 001 10 CAS ALS
>> >> 18/01/2005 13:01 19/01/2005 09:00 65
>> >> 004 85 SAM DFG
>> >> 13/05/2005 09:25 13/05/2005 18:54 65
>> >>
>> >> Quise ver si SQL Server tiene las funciones equivalentes en acces
>> >> First y
>> >> Last para realizar la siguiente consulta:
>> >>
>> >> select a.id_docto, a.folio,first(nombre) as UsrPrimeraMod,
>> >> last(nombre)
>> >> as
>> >> UsrUltimaMod, first(a.fecha) as FechaPrimMod, last(a.fecha) as
>> >> FechaUltMod,
>> >> a.codemp
>> >> from tabla a
>> >> where codempe
>> >> group by a.id_docto,a.folio,a.codemp
>> >> order by a.id_docto,folio
>> >>
>> >> Como realizarlo en SQL??
>> >>
>> >>
>> >>
>>
>>
>>



Respuesta Responder a este mensaje
#12 Penta
14/11/2005 - 19:15 | Informe spam
Hola.
No existe un primero ni un ultimo registro, por lo tanto, segun el
criterio que tu le indiques y si solo quieres el primero y el ultimo
seria top 1 en el order by XXX asc y luego la misma sentencia pero con
desc

Ahi obtienes el primero y el ultimo.

Salu2.
Penta.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida