Предполагая, что когда вы говорите «самый последний», вы имеете в виду «ближайший», как, например, «сохраненная дата - это наименьшее количество дней от текущей даты, и нам все равно, будет ли она до или после текущей даты», тогда это должен это сделать (может потребоваться тривиальная отладка):
SELECT ID, Name, AppointmentDate
from (select
ID
,Name
,AppointmentDate
,row_number() over (partition by ID order by abs(datediff(dd, AppointmentDate, getdate()))) Ranking
from MyTable) xx
where Ranking = 1
Используется функция row_number (), начиная с SQL 2005 и выше. Подзапрос «упорядочивает» данные в соответствии со спецификациями, а основной запрос выбирает наилучшее соответствие.
Обратите внимание, что:
- Поиск основан на текущей дате
- Мы рассчитываем только разницу в днях, время (часы, минуты и т. Д.) Игнорируется
- Если два дня равноудалены (скажем, 2 до и 2 после), мы выбираем один случайным образом
Все они могут быть скорректированы с учетом ваших конечных требований.