Мне нравится ответ Мики и Quassnoi (и голос Мики проголосовал), но, если ваши потребности похожи на мои, вы должны иметь в виду некоторые ограничения. Первое и самое главное, это работает, только если вы ищете последнюю запись в целом или последнюю запись для одного имени. Если вам нужна последняя запись для каждого человека в наборе (по одной записи на человека, но самая последняя запись для каждого), то вышеприведенные решения не годятся. Во-вторых, и что не менее важно, если вы будете работать с большими наборами данных, это может оказаться немного медленным в долгосрочной перспективе. Итак, что такое обходной путь?
Что я делаю, так это добавляю битовое поле в таблицу, помеченную как «новейшая». Затем, когда я сохраняю запись (что делается в хранимой процедуре в SQL Server), я следую этому шаблону:
Update Table Set Newest=0 Where Name=@Name
Insert into Table (Name, dateTimeVal, Data, Newest) Values (@Name, GetDate(), @Data, 1);
Также есть указатель на Name и Newest для быстрого выбора.
Тогда выбор просто:
Select dateTimeVal, Data From Table Where (Name=@Name) and (Newest=1);
Выбор для группы будет выглядеть примерно так:
Select Name, dateTimeVal, Data from Table Where (Newest=1); -- Gets multiple records
Если записи не могут быть введены в порядке дат, то ваша логика немного отличается:
Update Table Set Newest=0 Where Name=@Name
Insert into Table (Name, dateTimeVal, Data, Newest) Values (@Name, GetDate(), @Data, 0); -- NOTE ZERO
Update Table Set Newest=1 Where dateTimeVal=(Select Max(dateTimeVal) From Table Where Name=@Name);
Остальное остается прежним.