Retrieving last record in each group from database - SQL Server 2005/2008
Solution 1:
;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
Solution 2:
In SQL Server, the most performant solution is often a correlated subquery:
select t.*
from t
where t.lastupdate = (select max(t2.lastupdate)
from t t2
where t2.computername = t.computername
);
In particular, this can take advantage of an index on (computername, lastupdate)
. Conceptually, the reason this is faster than row_number()
is because this query simply filters out the rows that don't match. The row_number()
version needs to attach to the row number to all rows, before it filters -- that is more data processing.