consulta t-sql

26/05/2006 - 23:42 por anonimo | Informe spam
tengo la siguiente tabla con los siguientes registros...
tabla: historial
tablaid usuarioid fecha
1 1 11/12/2006 11:20:23
2 2 01/10/2006 09:15:20
3 3 10/09/2006 10:29:06
4 2 06/10/2006 02:34:52
5 3 03/08/2006 18:43:14
6 1 08/07/2006 01:54:00
7 1 01/09/2006 20:15:10
8 4 23/01/2006 11:25:35

lo que necesito es realizar una consulta en la cual me devuelva un registro
por cada usuario diferente de la tabla y en caso de existir mas de un
registro por usuario me devuelva el registro que contiene la fecha mas
reciente
tablaid usuarioid fecha
1 1 11/12/2006 11:20:23
3 3 10/09/2006 10:29:06
4 2 06/10/2006 02:34:52
8 4 23/01/2006 11:25:35


gracias

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
27/05/2006 - 00:29 | Informe spam
Trata,

select *
from t1
where not exists (
select *
from t1 as t2
where t2.usuarioid = t1.usuarioid and t2.fecha > t1.fecha
)
go


AMB

"anonimo" wrote:

tengo la siguiente tabla con los siguientes registros...
tabla: historial
tablaid usuarioid fecha
1 1 11/12/2006 11:20:23
2 2 01/10/2006 09:15:20
3 3 10/09/2006 10:29:06
4 2 06/10/2006 02:34:52
5 3 03/08/2006 18:43:14
6 1 08/07/2006 01:54:00
7 1 01/09/2006 20:15:10
8 4 23/01/2006 11:25:35

lo que necesito es realizar una consulta en la cual me devuelva un registro
por cada usuario diferente de la tabla y en caso de existir mas de un
registro por usuario me devuelva el registro que contiene la fecha mas
reciente
tablaid usuarioid fecha
1 1 11/12/2006 11:20:23
3 3 10/09/2006 10:29:06
4 2 06/10/2006 02:34:52
8 4 23/01/2006 11:25:35


gracias
Respuesta Responder a este mensaje
#2 BitOne®
27/05/2006 - 04:58 | Informe spam
alex, con tu permiso y respeto que mereces, disculpa mi osadia, pero creo que
el colega que pregunta solo quiere agrupar por el id del usuario y devolver la
mayor de las fechas.

algo como esto.

select usuarioid, max(fecha) fecha
from historial
group by usuarioid

Si no es asi favor corregir.

BitOne®




"Alejandro Mesa" escribió en el mensaje news:
Trata,

select *
from t1
where not exists (
select *
from t1 as t2
where t2.usuarioid = t1.usuarioid and t2.fecha > t1.fecha
)
go


AMB

"anonimo" wrote:

> tengo la siguiente tabla con los siguientes registros...
> tabla: historial
> tablaid usuarioid fecha
> 1 1 11/12/2006 11:20:23
> 2 2 01/10/2006 09:15:20
> 3 3 10/09/2006 10:29:06
> 4 2 06/10/2006 02:34:52
> 5 3 03/08/2006 18:43:14
> 6 1 08/07/2006 01:54:00
> 7 1 01/09/2006 20:15:10
> 8 4 23/01/2006 11:25:35
>
> lo que necesito es realizar una consulta en la cual me devuelva un registro
> por cada usuario diferente de la tabla y en caso de existir mas de un
> registro por usuario me devuelva el registro que contiene la fecha mas
> reciente
> tablaid usuarioid fecha
> 1 1 11/12/2006 11:20:23
> 3 3 10/09/2006 10:29:06
> 4 2 06/10/2006 02:34:52
> 8 4 23/01/2006 11:25:35
>
>
> gracias
Respuesta Responder a este mensaje
#3 Alejandro Mesa
29/05/2006 - 17:00 | Informe spam
BitOne®,

Fijate en que la columna [tablaid] aparece en el resultado esperado.


AMB

"BitOne®" wrote:

alex, con tu permiso y respeto que mereces, disculpa mi osadia, pero creo que
el colega que pregunta solo quiere agrupar por el id del usuario y devolver la
mayor de las fechas.

algo como esto.

select usuarioid, max(fecha) fecha
from historial
group by usuarioid

Si no es asi favor corregir.

BitOne®




"Alejandro Mesa" escribió en el mensaje news:
> Trata,
>
> select *
> from t1
> where not exists (
> select *
> from t1 as t2
> where t2.usuarioid = t1.usuarioid and t2.fecha > t1.fecha
> )
> go
>
>
> AMB
>
> "anonimo" wrote:
>
> > tengo la siguiente tabla con los siguientes registros...
> > tabla: historial
> > tablaid usuarioid fecha
> > 1 1 11/12/2006 11:20:23
> > 2 2 01/10/2006 09:15:20
> > 3 3 10/09/2006 10:29:06
> > 4 2 06/10/2006 02:34:52
> > 5 3 03/08/2006 18:43:14
> > 6 1 08/07/2006 01:54:00
> > 7 1 01/09/2006 20:15:10
> > 8 4 23/01/2006 11:25:35
> >
> > lo que necesito es realizar una consulta en la cual me devuelva un registro
> > por cada usuario diferente de la tabla y en caso de existir mas de un
> > registro por usuario me devuelva el registro que contiene la fecha mas
> > reciente
> > tablaid usuarioid fecha
> > 1 1 11/12/2006 11:20:23
> > 3 3 10/09/2006 10:29:06
> > 4 2 06/10/2006 02:34:52
> > 8 4 23/01/2006 11:25:35
> >
> >
> > gracias

Respuesta Responder a este mensaje
#4 anonimo
29/05/2006 - 18:04 | Informe spam
Muchas gracias a ambos por sus respuestas, si bien el query que postea BitOne
devuelve los datos correctos, yo necesitaba el tablaid en el conjunto de
resultados.
Ahora yo hice una consulta asi:
select *
from historial a1
where tablaid= (select max(tablaid) from historial a2 where
a2.usuarioid¡.usuarioid)

Esta consulta también me devuelve los datos que necesito, pero cual sería
mejor en la ejecución? la que posteó Alejandro o la que estoy posteando.
Muchas gracias

"Alejandro Mesa" escribió:

BitOne®,

Fijate en que la columna [tablaid] aparece en el resultado esperado.


AMB

"BitOne®" wrote:

> alex, con tu permiso y respeto que mereces, disculpa mi osadia, pero creo que
> el colega que pregunta solo quiere agrupar por el id del usuario y devolver la
> mayor de las fechas.
>
> algo como esto.
>
> select usuarioid, max(fecha) fecha
> from historial
> group by usuarioid
>
> Si no es asi favor corregir.
>
> BitOne®
>
>
>
>
> "Alejandro Mesa" escribió en el mensaje news:
> > Trata,
> >
> > select *
> > from t1
> > where not exists (
> > select *
> > from t1 as t2
> > where t2.usuarioid = t1.usuarioid and t2.fecha > t1.fecha
> > )
> > go
> >
> >
> > AMB
> >
> > "anonimo" wrote:
> >
> > > tengo la siguiente tabla con los siguientes registros...
> > > tabla: historial
> > > tablaid usuarioid fecha
> > > 1 1 11/12/2006 11:20:23
> > > 2 2 01/10/2006 09:15:20
> > > 3 3 10/09/2006 10:29:06
> > > 4 2 06/10/2006 02:34:52
> > > 5 3 03/08/2006 18:43:14
> > > 6 1 08/07/2006 01:54:00
> > > 7 1 01/09/2006 20:15:10
> > > 8 4 23/01/2006 11:25:35
> > >
> > > lo que necesito es realizar una consulta en la cual me devuelva un registro
> > > por cada usuario diferente de la tabla y en caso de existir mas de un
> > > registro por usuario me devuelva el registro que contiene la fecha mas
> > > reciente
> > > tablaid usuarioid fecha
> > > 1 1 11/12/2006 11:20:23
> > > 3 3 10/09/2006 10:29:06
> > > 4 2 06/10/2006 02:34:52
> > > 8 4 23/01/2006 11:25:35
> > >
> > >
> > > gracias
>
Respuesta Responder a este mensaje
#5 anonimo
29/05/2006 - 19:05 | Informe spam
Muchas gracias por tu observación y respuesta.

"Jorge Gonzalez" escribió:

Estimado Anonimo

la consulta que has posteado no funcionará siempre. Si notas con cuidado, tu
consulta depende de que tablaid y Fecha se correspondan en la escala de
mayor a menor. Pero si alguien incluyera una fecha menor a una fecha que ya
exista en la tabla y con un tablaid siempre creciente, entonces tu query
dejaría de funcionar.
Por esto la consulta de Alejandro es funcional y la que has posteado no. Un
ejemplo de datos que haría fallar tu consulta sería:

tabla: historial
tablaid usuarioid fecha
1 1 11/12/2006 11:20:23
2 2 06/10/2006 09:15:20
3 3 10/09/2006 10:29:06
4 2 01/10/2006 02:34:52

Teniendo como resultado para el usuario 2 la fila con tablaId = 4 y 2 lo
cual sería incorrecto


Otra versión que trabajaría bien sería:

SELECT H.* FROM Historial H
INNER JOIN (select UsuarioId, Max(Fecha)
from Historial
Group by UsuarioId) T
ON H.usuarioid = T.usuarioid AND H.Fecha = T.Fecha


La mejor o peor eficiencia entre este query y el el AMB te toca determinarla
analizando el plan de ejecución.

Saludos

Jorge González


"anonimo" escribió en el mensaje
news:
> Muchas gracias a ambos por sus respuestas, si bien el query que postea
> BitOne
> devuelve los datos correctos, yo necesitaba el tablaid en el conjunto de
> resultados.
> Ahora yo hice una consulta asi:
> select *
> from historial a1
> where tablaid= (select max(tablaid) from historial a2 where
> a2.usuarioid¡.usuarioid)
>
> Esta consulta también me devuelve los datos que necesito, pero cual sería
> mejor en la ejecución? la que posteó Alejandro o la que estoy posteando.
> Muchas gracias
>
> "Alejandro Mesa" escribió:
>
>> BitOne®,
>>
>> Fijate en que la columna [tablaid] aparece en el resultado esperado.
>>
>>
>> AMB
>>
>> "BitOne®" wrote:
>>
>> > alex, con tu permiso y respeto que mereces, disculpa mi osadia, pero
>> > creo que
>> > el colega que pregunta solo quiere agrupar por el id del usuario y
>> > devolver la
>> > mayor de las fechas.
>> >
>> > algo como esto.
>> >
>> > select usuarioid, max(fecha) fecha
>> > from historial
>> > group by usuarioid
>> >
>> > Si no es asi favor corregir.
>> >
>> > BitOne®
>> >
>> >
>> >
>> >
>> > "Alejandro Mesa" escribió en
>> > el mensaje news:
>> > > Trata,
>> > >
>> > > select *
>> > > from t1
>> > > where not exists (
>> > > select *
>> > > from t1 as t2
>> > > where t2.usuarioid = t1.usuarioid and t2.fecha > t1.fecha
>> > > )
>> > > go
>> > >
>> > >
>> > > AMB
>> > >
>> > > "anonimo" wrote:
>> > >
>> > > > tengo la siguiente tabla con los siguientes registros...
>> > > > tabla: historial
>> > > > tablaid usuarioid fecha
>> > > > 1 1 11/12/2006 11:20:23
>> > > > 2 2 01/10/2006 09:15:20
>> > > > 3 3 10/09/2006 10:29:06
>> > > > 4 2 06/10/2006 02:34:52
>> > > > 5 3 03/08/2006 18:43:14
>> > > > 6 1 08/07/2006 01:54:00
>> > > > 7 1 01/09/2006 20:15:10
>> > > > 8 4 23/01/2006 11:25:35
>> > > >
>> > > > lo que necesito es realizar una consulta en la cual me devuelva un
>> > > > registro
>> > > > por cada usuario diferente de la tabla y en caso de existir mas de
>> > > > un
>> > > > registro por usuario me devuelva el registro que contiene la fecha
>> > > > mas
>> > > > reciente
>> > > > tablaid usuarioid fecha
>> > > > 1 1 11/12/2006 11:20:23
>> > > > 3 3 10/09/2006 10:29:06
>> > > > 4 2 06/10/2006 02:34:52
>> > > > 8 4 23/01/2006 11:25:35
>> > > >
>> > > >
>> > > > gracias
>> >



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida