A little messy and convoluted - probably there are simpler ways to do this...SELECT
a.id,
CASE WHEN c.updatetime > b.updatetime THEN c.updatetime ELSE b.updatetime END AS updatetime,
b.fname,
c.lname
FROM
(SELECT DISTINCT id FROM Tbl) a
OUTER APPLY
(
SELECT TOP 1 b.updatetime,b.fname FROM Tbl b
WHERE b.id = a.id AND b.fname IS NOT NULL
ORDER BY updatetime DESC
)b
OUTER APPLY
(
SELECT TOP 1 c.updatetime,c.lname FROM Tbl c
WHERE c.id = a.id AND c.lname IS NOT NULL
ORDER BY updatetime DESC
)c