Recuperando el último registro en cada grupo de la base de datos – SQL Server 2005/2008

He hecho algo de seaching y parece que no puedo obtener los resultados que estoy buscando. Básicamente, tenemos cuatro sistemas de gestión diferentes en toda nuestra empresa y estoy en el proceso de combinar todos los datos de cada sistema de forma regular. Mi objective es actualizar los datos cada hora en una base de datos central. Aquí hay un conjunto de datos de muestra con los que estoy trabajando:

COMPUTERNAME | SERIALNUMBER | USERNAME | LASTIP | LASTUPDATE | SOURCE TEST1 | 1111 | BOB | 1.1.1.1 | 1/17/2011 01:00:00 | MGMT_SYSTEM_1 TEST1 | 1111 | BOB | 1.1.1.1 | 1/18/2011 01:00:00 | MGMT_SYSTEM_2 TEST1 | 1111 | PETER | 1.1.1.11 | 1/19/2011 01:00:00 | MGMT_SYSTEM_3 TEST2 | 2222 | GEORGE | 1.1.1.2 | 1/17/2011 01:00:00 | MGMT_SYSTEM_1 TEST3 | 3333 | TOM | 1.1.1.3 | 1/19/2011 01:00:00 | MGMT_SYSTEM_2 TEST4 | 4444 | MIKE | 1.1.1.4 | 1/17/2011 01:00:00 | MGMT_SYSTEM_1 TEST4 | 4444 | MIKE | 1.1.1.41 | 1/19/2011 01:00:00 | MGMT_SYSTEM_3 TEST5 | 5555 | SUSIE | 1.1.1.5 | 1/19/2011 01:00:00 | MGMT_SYSTEM_1 

Así que quiero consultar esta tabla maestra y solo recuperar el último registro (basado en LASTUPDATE) de esa manera puedo obtener la información más reciente sobre ese sistema. El problema es que un sistema puede estar en cada base de datos, pero por supuesto nunca tendrán la misma hora de actualización exacta.

Esperaría obtener algo como esto:

 TEST1 | 1111 | PETER | 1.1.1.11 | 1/19/2011 01:00:00 | MGMT_SYSTEM_3 TEST2 | 2222 | GEORGE | 1.1.1.2 | 1/17/2011 01:00:00 | MGMT_SYSTEM_1 TEST3 | 3333 | TOM | 1.1.1.3 | 1/19/2011 01:00:00 | MGMT_SYSTEM_2 TEST4 | 4444 | MIKE | 1.1.1.41 | 1/19/2011 01:00:00 | MGMT_SYSTEM_3 TEST5 | 5555 | SUSIE | 1.1.1.5 | 1/19/2011 01:00:00 | MGMT_SYSTEM_1 

He intentado usar la función MAX, pero con eso solo puedo recuperar una columna. Y no puedo usar eso en una subconsulta porque no tengo un campo de ID único que me proporcione el último registro actualizado. Uno de los sistemas es una base de datos MySQL y la función MAX en MySQL realmente funcionará de la manera que lo necesito para devolver solo un registro por GROUP BY, pero no funciona en SQL Server.

Estoy pensando que necesito usar MAX y IZQUIERDA, pero mis bashs hasta ahora han fallado.

Su ayuda sería muy apreciada. He estado trabajando en mi cerebro durante las últimas 3-4 horas tratando de obtener una consulta de trabajo. Esta tabla maestra se encuentra en un servidor SQL Server 2005.

¡Gracias!

 ;with cteRowNumber as ( select COMPUTERNAME, SERIALNUMBER, USERNAME, LASTIP, LASTUPDATE, SOURCE, row_number() over(partition by COMPUTERNAME order by LASTUPDATE desc) as RowNum from YourTable ) select COMPUTERNAME, SERIALNUMBER, USERNAME, LASTIP, LASTUPDATE, SOURCE from cteRowNumber where RowNum = 1 

En SQL Server, la solución más eficaz suele ser una subconsulta correlacionada:

 select t.* from t where t.lastupdate = (select max(t2.lastupdate) from t t2 where t2.computername = t.computername ); 

En particular, esto puede aprovechar un índice en (computername, lastupdate) . Conceptualmente, la razón por la que esto es más rápido que row_number() es porque esta consulta simplemente filtra las filas que no coinciden. La versión row_number() debe adjuntarse al número de fila en todas las filas, antes de que se filtre, es decir, se procesa más datos.