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

#6 Sergio Rodriguez
14/11/2005 - 15:50 | Informe spam
es SQL2000

"Maxi" escribió en el mensaje
news:%
Hola, nuestro amigo no indico que SQL tiene, si es en 2000 es correcto lo
que indica Ale, si es en 2005 hayu otras formas de hacer esto mucho mas
simple, existe la funcion Row_number() la cual nos es util para numerar
filas y se podria buscar el primero y el ultimo con ella, la unica
desventaja que le veo aun es que se debe materializar la tabla para hacer
un where sobre un row_number() :(


Salu2
Maxi [MVP SQL SERVER]


"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
#7 Alejandro Mesa
14/11/2005 - 16:39 | Informe spam
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
#8 Miguel Egea
14/11/2005 - 16:50 | Informe spam
De todas formas row_number y todas las funcines de ranking requieren de una
cláusula order by, es decir que seguimos sin saber que registro se ordenó
primero y último, aunque si es cierto que las posibilidades de hacer queries
aumentan um montón.


Miguel Egea
Visita mi web http://www.portalsql.com
SQL Server MVP, Mentor
Solid Quality Learning
http://www.SolidQualityLearning.com
"Solid Quality Learning is the trusted global provider of advanced education
and solutions for the entire Microsoft database platform"

"Sergio Rodriguez" wrote in message
news:
es SQL2000

"Maxi" escribió en el mensaje
news:%
Hola, nuestro amigo no indico que SQL tiene, si es en 2000 es correcto lo
que indica Ale, si es en 2005 hayu otras formas de hacer esto mucho mas
simple, existe la funcion Row_number() la cual nos es util para numerar
filas y se podria buscar el primero y el ultimo con ella, la unica
desventaja que le veo aun es que se debe materializar la tabla para hacer
un where sobre un row_number() :(


Salu2
Maxi [MVP SQL SERVER]


"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
#9 Miguel Egea
14/11/2005 - 16:51 | Informe spam
La respuesta que te ha dado alejandro es justo a la ayuda que yo me refería,
repasalá verás como te es de muchísima ayuda.


Miguel Egea
Visita mi web http://www.portalsql.com
SQL Server MVP, Mentor
Solid Quality Learning
http://www.SolidQualityLearning.com
"Solid Quality Learning is the trusted global provider of advanced education
and solutions for the entire Microsoft database platform"

"Sergio Rodriguez" wrote in message
news:%
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?

"Miguel Egea" escribió en el mensaje
news:
No, no las tiene, tendrás queu sar max y min, si te valen si no te valen,
podemos preparar algún script que ayude. Cuentanos.

Miguel Egea
Visita mi web http://www.portalsql.com
SQL Server MVP, Mentor
Solid Quality Learning
http://www.SolidQualityLearning.com
"Solid Quality Learning is the trusted global provider of advanced
education and solutions for the entire Microsoft database platform"

"Sergio Rodriguez" wrote in message
news:
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
#10 Sergio Rodriguez
14/11/2005 - 18:06 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida