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

#1 Antonio Ortiz
02/04/2008 - 19:05 | Informe spam
A ver si te sirve:

Select Min(ID) as ID, Min(Nombre) As Nombre, Max(Fecha) as Fecha
From Tabla
Group By Nombre


Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com



"Virginia Guzon" escribió en el mensaje
news:
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
#2 Virginia Guzon
02/04/2008 - 20:42 | Informe spam
Muchas gracias Antonio,

Una puntualización, la tabla tiene más campos que no puse y necesito tambien
recoger en la consulta, y si armo la consulta tal cual, me salta un mensaje
de error y me dice que el campo/s "LUGAR" de la lista de distribución no es
válida porque no está contenida en una funcíón de agregado ni en la cláusula
GROUP BY"

Como puedo además añadir en la consulta el resto de campos?

Muchas gracias y disculpa la ignorancia

Saludos

"Antonio Ortiz" escribió en el mensaje
news:%
A ver si te sirve:

Select Min(ID) as ID, Min(Nombre) As Nombre, Max(Fecha) as Fecha
From Tabla
Group By Nombre


Antonio Ortiz
asesor en sistemas
www.aortiz.net
www.progvisual.com



"Virginia Guzon" escribió en el mensaje
news:
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
#3 Alejandro Mesa
03/04/2008 - 01:51 | Informe spam
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
#4 Virginia Guzon
03/04/2008 - 09:09 | Informe spam
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
#5 Alejandro Mesa
03/04/2008 - 14:47 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida