Powinno działać coś takiego:
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
To zwróci co najwyżej dwa wiersze. Nie jest jasne, czy używasz kolumn z datami typu data i godzina, czy faktycznie używasz zarezerwowanych słów jako nazw kolumn, więc będziesz musiał się z tym bawić. (Pominąłem Czas, ale możesz łatwo dodać to do różnych porządków i filtrów.)
Biorąc pod uwagę zmienione kryteria, staje się to nieco trudniejsze, ponieważ włączenie lub wyłączenie wiersza zależy od wartości zwróconej w innym wierszu. Tutaj „drugi” wiersz, jeśli są dwa lub więcej wierszy, jest uwzględniany tylko wtedy, gdy „pierwszy” wiersz ma określoną wartość. Standardowym sposobem, aby to zrobić, jest zapytanie o dane w celu uzyskania maksymalnej wartości, a następnie ponowne zapytanie, odwołując się do wyniku pierwszego zestawu.
Jednak za pomocą numeru wiersza możesz zrobić wiele gównianych rzeczy. Pracuj nad tym:
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
Musisz rozwiązać problem z datą/godziną, ponieważ działa to tylko w przypadku dat.