Armar consulta SQL

02/04/2008 - 18:59 por Virginia Guzon | Informe spam
Hola a todos de nuevo,

Os cuento a ver si alguien me puede ayudar con una consulta en SQL

Tengo una aplicacion en VB 6.0 contra SQL y ADODB. En esa BBDD en SQL tengo
una Tabla con los siguientes campos:

TABLA
Id
Nombre
Fecha

TABLA
1 Julio 01/01/2008
2 Julio 02/02/2008
3 Marcos 02/02/2008
4 Marcos 05/02/2008
5 Julio 06/02/2008


Pues bien, alguien me puede decir como puedo traer en una recordset
solamente todos los registros con nombres distintos cuya fecha sea la más
reciente?, es decir, en este caso tendría que traer 2 registros:

5 Julio 06/02/2008
4 Marcos 05/02/2008

Espero haberme explicado bien

Saludos.

Preguntas similare

Leer las respuestas

#6 Virginia Guzon
03/04/2008 - 17:06 | Informe spam
Hola Alejandro,

Las columnas son Tipo y Fecha

Saludos,


"Alejandro Mesa" escribió en el
mensaje news:
Virginia Guzon,

Esta tabla es diferente a la que posteastes en tu primer msg. Cuales son
las
columnas por las cuales deseas hacer la comprobacion?

ID y FECHA?


AMB

"Virginia Guzon" wrote:

Gracias por tu ayuda

Nada, que no consigo armar la consulta en condiciones
Os pongo la estuctura excacta de la tabla a ver si me podeis echar un
cable
a armarla:

TABLA
ID
IDPARCELA
TIPO
LUGAR
FECHA
HORA
FECHA_UPDATE
OP
OCUPACION

Muchas gracias de nuevo

Saludos,


"Alejandro Mesa" escribió en el
mensaje news:
> Virginia Guzon,
>
> Trata:
>
> select *
> from t as a
> where not exists (
> select *
> from t as b
> where b.nombre = a.nombre and b.fecha > a.fecha
> )
>
> En palabras seria (no se burlen de mi español :-)):
>
> seleccionar las filas donde no exista otra fila con igual nombre pero
> con
> fecha mayor a la fecha de la fila corriente.
>
> Si por casualidad existe el mismo nombre con la misma fecha, entonces
> podemos usar el [id] para romper el empate.
>
> select *
> from t as a
> where not exists (
> select *
> from t as b
> where
> (b.nombre = a.nombre and b.fecha > a.fecha)
> or
> (b.nombre = a.nombre and b.fecha = a.fecha and b.Id < a.Id)
> )
>
> En palabras:
>
> seleccionar las filas donde no exista otra fila con igual nombre y
> fecha
> mayor a la fecha de la fila corriente, o con igual nombre y fecha pero
> con
> Id
> menor al Id de la fila corriente.
>
> Tambien puedes usar:
>
> select *
> from t as a
> where Id = (
> select min(b.Id)
> from t as b
> where b.nombre = a.nombre and b.fecha = (
> select max(c.fecha)
> from t as c
> where c.nombre = a.nombre
> )
> )
>
> En palabras:
>
> seleccionar las filas donde el Id sea igual al menor de los Ids cuyo
> nombre
> es igual al nombre de la fila que se procesa, y que su fecha sea igual
> a
> la
> fecha mayor de las filas con el mismo nombre.
>
> Si estuvieses usando SS 2005,
>
> ;with cte
> as
> (
> select *, row_number() over(partition by nombre order by fecha DESC, Id
> ASC)
> as rn
> from t
> )
> select *
> from cte
> where rn = 1;
>
> Tener un indice por (nombre, fecha DESC, Id) puede ayudar al desempenio
> de
> la ultima sentencia (2005).
>
>
> AMB
>
>
> "Virginia Guzon" wrote:
>
>> Hola a todos de nuevo,
>>
>> Os cuento a ver si alguien me puede ayudar con una consulta en SQL
>>
>> Tengo una aplicacion en VB 6.0 contra SQL y ADODB. En esa BBDD en SQL
>> tengo
>> una Tabla con los siguientes campos:
>>
>> TABLA
>> Id
>> Nombre
>> Fecha
>>
>> TABLA
>> 1 Julio 01/01/2008
>> 2 Julio 02/02/2008
>> 3 Marcos 02/02/2008
>> 4 Marcos 05/02/2008
>> 5 Julio 06/02/2008
>>
>>
>> Pues bien, alguien me puede decir como puedo traer en una recordset
>> solamente todos los registros con nombres distintos cuya fecha sea la
>> más
>> reciente?, es decir, en este caso tendría que traer 2 registros:
>>
>> 5 Julio 06/02/2008
>> 4 Marcos 05/02/2008
>>
>> Espero haberme explicado bien
>>
>> Saludos.
>>
>>
>>



Respuesta Responder a este mensaje
#7 Alejandro Mesa
03/04/2008 - 22:13 | Informe spam
Virginia Guzon,

select *
from t as a
where not exists (
select *
from t as b
where b.tipo = a.tipo and b.fecha > a.fecha
)

si existene dos o mas filas de un mismo tipo, pero con igual fecha, entonces
pudieras usar otra columna para romper el empate. Supongamos que ID es unico,
entonces podemos escoger el de menor valor en esa columna.

select *
from t as a
where not exists (
select *
from t as b
where
(b.tipo = a.tipo and b.fecha > a.fecha)
or
(b.tipo = a.tipo and b.fecha = a.fecha and b.ID < a.ID)
)


AMB

"Virginia Guzon" wrote:

Hola Alejandro,

Las columnas son Tipo y Fecha

Saludos,


"Alejandro Mesa" escribió en el
mensaje news:
> Virginia Guzon,
>
> Esta tabla es diferente a la que posteastes en tu primer msg. Cuales son
> las
> columnas por las cuales deseas hacer la comprobacion?
>
> ID y FECHA?
>
>
> AMB
>
> "Virginia Guzon" wrote:
>
>> Gracias por tu ayuda
>>
>> Nada, que no consigo armar la consulta en condiciones
>> Os pongo la estuctura excacta de la tabla a ver si me podeis echar un
>> cable
>> a armarla:
>>
>> TABLA
>> ID
>> IDPARCELA
>> TIPO
>> LUGAR
>> FECHA
>> HORA
>> FECHA_UPDATE
>> OP
>> OCUPACION
>>
>> Muchas gracias de nuevo
>>
>> Saludos,
>>
>>
>> "Alejandro Mesa" escribió en el
>> mensaje news:
>> > Virginia Guzon,
>> >
>> > Trata:
>> >
>> > select *
>> > from t as a
>> > where not exists (
>> > select *
>> > from t as b
>> > where b.nombre = a.nombre and b.fecha > a.fecha
>> > )
>> >
>> > En palabras seria (no se burlen de mi español :-)):
>> >
>> > seleccionar las filas donde no exista otra fila con igual nombre pero
>> > con
>> > fecha mayor a la fecha de la fila corriente.
>> >
>> > Si por casualidad existe el mismo nombre con la misma fecha, entonces
>> > podemos usar el [id] para romper el empate.
>> >
>> > select *
>> > from t as a
>> > where not exists (
>> > select *
>> > from t as b
>> > where
>> > (b.nombre = a.nombre and b.fecha > a.fecha)
>> > or
>> > (b.nombre = a.nombre and b.fecha = a.fecha and b.Id < a.Id)
>> > )
>> >
>> > En palabras:
>> >
>> > seleccionar las filas donde no exista otra fila con igual nombre y
>> > fecha
>> > mayor a la fecha de la fila corriente, o con igual nombre y fecha pero
>> > con
>> > Id
>> > menor al Id de la fila corriente.
>> >
>> > Tambien puedes usar:
>> >
>> > select *
>> > from t as a
>> > where Id = (
>> > select min(b.Id)
>> > from t as b
>> > where b.nombre = a.nombre and b.fecha = (
>> > select max(c.fecha)
>> > from t as c
>> > where c.nombre = a.nombre
>> > )
>> > )
>> >
>> > En palabras:
>> >
>> > seleccionar las filas donde el Id sea igual al menor de los Ids cuyo
>> > nombre
>> > es igual al nombre de la fila que se procesa, y que su fecha sea igual
>> > a
>> > la
>> > fecha mayor de las filas con el mismo nombre.
>> >
>> > Si estuvieses usando SS 2005,
>> >
>> > ;with cte
>> > as
>> > (
>> > select *, row_number() over(partition by nombre order by fecha DESC, Id
>> > ASC)
>> > as rn
>> > from t
>> > )
>> > select *
>> > from cte
>> > where rn = 1;
>> >
>> > Tener un indice por (nombre, fecha DESC, Id) puede ayudar al desempenio
>> > de
>> > la ultima sentencia (2005).
>> >
>> >
>> > AMB
>> >
>> >
>> > "Virginia Guzon" wrote:
>> >
>> >> Hola a todos de nuevo,
>> >>
>> >> Os cuento a ver si alguien me puede ayudar con una consulta en SQL
>> >>
>> >> Tengo una aplicacion en VB 6.0 contra SQL y ADODB. En esa BBDD en SQL
>> >> tengo
>> >> una Tabla con los siguientes campos:
>> >>
>> >> TABLA
>> >> Id
>> >> Nombre
>> >> Fecha
>> >>
>> >> TABLA
>> >> 1 Julio 01/01/2008
>> >> 2 Julio 02/02/2008
>> >> 3 Marcos 02/02/2008
>> >> 4 Marcos 05/02/2008
>> >> 5 Julio 06/02/2008
>> >>
>> >>
>> >> Pues bien, alguien me puede decir como puedo traer en una recordset
>> >> solamente todos los registros con nombres distintos cuya fecha sea la
>> >> más
>> >> reciente?, es decir, en este caso tendría que traer 2 registros:
>> >>
>> >> 5 Julio 06/02/2008
>> >> 4 Marcos 05/02/2008
>> >>
>> >> Espero haberme explicado bien
>> >>
>> >> Saludos.
>> >>
>> >>
>> >>
>>
>>
>>



Respuesta Responder a este mensaje
#8 Virginia Guzon
04/04/2008 - 14:35 | Informe spam
Gracias Alejandro
Voy a probar

Saludos,

"Alejandro Mesa" escribió en el
mensaje news:
Virginia Guzon,

select *
from t as a
where not exists (
select *
from t as b
where b.tipo = a.tipo and b.fecha > a.fecha
)

si existene dos o mas filas de un mismo tipo, pero con igual fecha,
entonces
pudieras usar otra columna para romper el empate. Supongamos que ID es
unico,
entonces podemos escoger el de menor valor en esa columna.

select *
from t as a
where not exists (
select *
from t as b
where
(b.tipo = a.tipo and b.fecha > a.fecha)
or
(b.tipo = a.tipo and b.fecha = a.fecha and b.ID < a.ID)
)


AMB

"Virginia Guzon" wrote:

Hola Alejandro,

Las columnas son Tipo y Fecha

Saludos,


"Alejandro Mesa" escribió en el
mensaje news:
> Virginia Guzon,
>
> Esta tabla es diferente a la que posteastes en tu primer msg. Cuales
> son
> las
> columnas por las cuales deseas hacer la comprobacion?
>
> ID y FECHA?
>
>
> AMB
>
> "Virginia Guzon" wrote:
>
>> Gracias por tu ayuda
>>
>> Nada, que no consigo armar la consulta en condiciones
>> Os pongo la estuctura excacta de la tabla a ver si me podeis echar un
>> cable
>> a armarla:
>>
>> TABLA
>> ID
>> IDPARCELA
>> TIPO
>> LUGAR
>> FECHA
>> HORA
>> FECHA_UPDATE
>> OP
>> OCUPACION
>>
>> Muchas gracias de nuevo
>>
>> Saludos,
>>
>>
>> "Alejandro Mesa" escribió en
>> el
>> mensaje news:
>> > Virginia Guzon,
>> >
>> > Trata:
>> >
>> > select *
>> > from t as a
>> > where not exists (
>> > select *
>> > from t as b
>> > where b.nombre = a.nombre and b.fecha > a.fecha
>> > )
>> >
>> > En palabras seria (no se burlen de mi español :-)):
>> >
>> > seleccionar las filas donde no exista otra fila con igual nombre
>> > pero
>> > con
>> > fecha mayor a la fecha de la fila corriente.
>> >
>> > Si por casualidad existe el mismo nombre con la misma fecha,
>> > entonces
>> > podemos usar el [id] para romper el empate.
>> >
>> > select *
>> > from t as a
>> > where not exists (
>> > select *
>> > from t as b
>> > where
>> > (b.nombre = a.nombre and b.fecha > a.fecha)
>> > or
>> > (b.nombre = a.nombre and b.fecha = a.fecha and b.Id < a.Id)
>> > )
>> >
>> > En palabras:
>> >
>> > seleccionar las filas donde no exista otra fila con igual nombre y
>> > fecha
>> > mayor a la fecha de la fila corriente, o con igual nombre y fecha
>> > pero
>> > con
>> > Id
>> > menor al Id de la fila corriente.
>> >
>> > Tambien puedes usar:
>> >
>> > select *
>> > from t as a
>> > where Id = (
>> > select min(b.Id)
>> > from t as b
>> > where b.nombre = a.nombre and b.fecha = (
>> > select max(c.fecha)
>> > from t as c
>> > where c.nombre = a.nombre
>> > )
>> > )
>> >
>> > En palabras:
>> >
>> > seleccionar las filas donde el Id sea igual al menor de los Ids cuyo
>> > nombre
>> > es igual al nombre de la fila que se procesa, y que su fecha sea
>> > igual
>> > a
>> > la
>> > fecha mayor de las filas con el mismo nombre.
>> >
>> > Si estuvieses usando SS 2005,
>> >
>> > ;with cte
>> > as
>> > (
>> > select *, row_number() over(partition by nombre order by fecha DESC,
>> > Id
>> > ASC)
>> > as rn
>> > from t
>> > )
>> > select *
>> > from cte
>> > where rn = 1;
>> >
>> > Tener un indice por (nombre, fecha DESC, Id) puede ayudar al
>> > desempenio
>> > de
>> > la ultima sentencia (2005).
>> >
>> >
>> > AMB
>> >
>> >
>> > "Virginia Guzon" wrote:
>> >
>> >> Hola a todos de nuevo,
>> >>
>> >> Os cuento a ver si alguien me puede ayudar con una consulta en SQL
>> >>
>> >> Tengo una aplicacion en VB 6.0 contra SQL y ADODB. En esa BBDD en
>> >> SQL
>> >> tengo
>> >> una Tabla con los siguientes campos:
>> >>
>> >> TABLA
>> >> Id
>> >> Nombre
>> >> Fecha
>> >>
>> >> TABLA
>> >> 1 Julio 01/01/2008
>> >> 2 Julio 02/02/2008
>> >> 3 Marcos 02/02/2008
>> >> 4 Marcos 05/02/2008
>> >> 5 Julio 06/02/2008
>> >>
>> >>
>> >> Pues bien, alguien me puede decir como puedo traer en una recordset
>> >> solamente todos los registros con nombres distintos cuya fecha sea
>> >> la
>> >> más
>> >> reciente?, es decir, en este caso tendría que traer 2 registros:
>> >>
>> >> 5 Julio 06/02/2008
>> >> 4 Marcos 05/02/2008
>> >>
>> >> Espero haberme explicado bien
>> >>
>> >> Saludos.
>> >>
>> >>
>> >>
>>
>>
>>



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