Другой вариант, если у вас есть SQL 2005 (я думаю?) Или более поздняя версия, будет использовать общее табличное выражение и вытащить из таблицы идентификатор пользователя и максимальную дату, а затем соединиться, чтобы получить совпадающие имя и фамилию в максимальная дата ПРИМЕЧАНИЕ. При этом предполагается, что идентификатор пользователя + дата всегда будет уникальным, запрос будет прерван, если вы получите 2 строки с одинаковыми идентификатором пользователя и датой. Как уже отмечали другие, это довольно ужасный дизайн базы данных - но иногда это жизнь, проблема все равно должна быть решена. например,
declare @Table table (userid int,firstname varchar(10),lastname varchar(20), userupdate datetime)
INSERT @Table VALUES (1, 'Dan' ,'Kramer' ,'1/1/2005')
INSERT @Table VALUES (1, 'Dan' ,'Kramer' ,'1/1/2007')
INSERT @Table VALUES (1, 'Dan' ,'Kramer' ,'1/1/2009')
INSERT @Table VALUES (2, 'Pamella' ,'Slattery' ,'1/1/2005')
INSERT @Table VALUES (2, 'Pam' ,'Slattery' ,'1/1/2006')
INSERT @Table VALUES (2, 'Pam' ,'Slattery' ,'1/1/2008')
INSERT @Table VALUES (3, 'Samamantha' ,'Cohen' ,'1/1/2008')
INSERT @Table VALUES (3, 'Sam' ,'Cohen' ,'1/1/2009');
with cte ( userid , maxdt ) as
(select userid,
max(userupdate)
from @table
group by userid)
SELECT dt.Userid,
dt.firstname,
dt.lastname,
cte.maxdt
FROM
@Table dt
join cte on cte.userid = dt.userid and dt.userupdate = cte.maxdt
выход
Userid firstname lastname maxdt
----------- ---------- -------------------- -----------------------
3 Sam Cohen 2009-01-01 00:00:00.000
2 Pam Slattery 2008-01-01 00:00:00.000
1 Dan Kramer 2009-01-01 00:00:00.000