Нещо като следното трябва да работи:
SELECT ID, Date, Time, Status
from (select ID, Date, Time, Status, row_number() over (order by Date) Ranking
from MyTable
where ID = @SearchId
and Date <= @SearchDate) xx
where Ranking < 3
order by Date, Time
Това ще върне най-много два реда. Не е ясно дали използвате колони с данни за дата и час, или всъщност използвате запазени думи като имена на колони, така че ще трябва да се суете с това. (Изоставих времето, но можете лесно да го добавите към различните подреждания и филтри.)
Като се имат предвид ревизираните критерии, става малко по-сложно, тъй като включването или изключването на ред зависи от стойността, върната в различен ред. Тук „вторият“ ред, ако има два или повече реда, се включва само ако „първият“ ред е равен на определена стойност. Стандартният начин да направите това е да направите запитване към данните, за да получите максималната стойност, след което да го направите отново, докато препращате към резултата от първия набор.
Въпреки това можете да правите много гадни неща с row_number. Работете върху това:
SELECT ID, Date, Time, Status
from (select
ID, Date, Time, Status
,row_number() over (partition by case when Date = @SearchDate then 0 else 1 end
order by case when Date = @SearchDate then 0 else 1 end
,Date) Ranking
from MyTable
where ID = @SearchId
and Date <= @SearchDate) xx
where Ranking = 1
order by Date, Time
Ще трябва да разрешите проблема с датата/часа, тъй като това работи само срещу дати.