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

#6 Alejandro Mesa
29/05/2006 - 19:17 | Informe spam
anonimo,

Creo que con la respuesta de Jorge es suficiente, pero quiero indicarte que
estuvistes muy cerca de otra posible solucion. Si en lugar de calcular el
max(tablaid), usas max(fecha) tu query funcionaria sin problemas.

select *
from historial a1
where fecha = (select max(a2.fecha) from historial a2 where
a2.usuarioid¡.usuarioid)

Cual version es mas eficiente?

La mejor manera de saberlo es comparando los planes de ejecucion y el costo
de cada sentencia dentro del batch.

AMB

"anonimo" wrote:

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
#7 Jorge Gonzalez
29/05/2006 - 19:44 | Informe spam
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
#8 Gerald
01/06/2006 - 00:22 | Informe spam
Jorge a estado muy coherente y acertado en sus comentarios.

Pero si quieres ponerle la cereza al dulce te diría que apliques un DISTICT
a la consulta.

Cabe la posibilidad dependiendo de como se procesan tus registros y de la
velocidad , que se generen registros dentro del mismo valor DATETIME.
(Exactamente la misma hora), si ocurriese esto tendrías dos o más registros
por usuario con la misma fecha reciente en lugar de uno que es lo que
quieres.



Saludos,

Gerald Shirley


"anonimo" escribió en el mensaje
news:
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
> >> >
>
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida