SQL Server - Obtener un registro por group by?

 
Vista:
sin imagen de perfil

Obtener un registro por group by?

Publicado por Juan Manuel Cruz (59 intervenciones) el 28/12/2010 14:24:04
Tengo una tabla con la lista de entradas a almacén de artículos.

La tabla contiene: codigo de articulo, tipo de entrada, fecha del movimiento y persona que lo registró.

¿Cómo obtengo una consulta donde me muestre sólo el más reciente movimiento por cada artículo?

Cada línea resultante debe mostrar los cuatro campos ya mencionados de ese movimiento más reciente.

Con Top1-Order By solo obtengo una linea, pero no de todo el movimiento... Con Max() y group by sólo obtengo la fecha máxima, pero no hay manera de encadenar y devolver el registro completo...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

RE:Obtener un registro por group by?

Publicado por Isaias (4558 intervenciones) el 28/12/2010 17:03:18
Dime si te funcionaria asi:

select * from tutabla t1 inner join (
select [codigo de articulo], [tipo de entrada], max([fecha del movimiento]) as Fecha
from tutabla
group by [codigo de articulo], [tipo de entrada]) as t2
ON t1.[codigo de articulo] = t2.[codigo de articulo] and
t1.[tipo de entrada] = t2.[tipo de entrada] and
t1.[fecha del movimiento] = t2.Fecha
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Obtener un registro por group by?

Publicado por Juan Manuel Cruz (59 intervenciones) el 28/12/2010 18:00:09
Cojo la idea, pero debido a que muchos artículos pueden tener para una fecha y tipo concretos, más de una entrada, no sería del todo fiable...

Como sea, he usado una CTE para resolverlo, el código quedaría asi:

with recurso
as (
select *, row_number() over (partition by cod_art order by fecha desc) as orden from entradas
)
select * from recurso where orden=1 order by cast(cod_art as int) desc


Resumiendo: se crea un contador que cada vez que cambia el código se resetea a 1, y como el orden es de fecha inversa, el más reciente será siempre el 1 para cada artículo.
Luego es sólo cosa de seleccionar del conjunto resultante el q tiene el contador 1.

Gracias por la ayuda :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

RE:Obtener un registro por group by?

Publicado por Isaias (4558 intervenciones) el 28/12/2010 19:25:40
2005 u 2008, si, puedes hacer uso de CTE
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar