Quelque chose comme ce qui suit devrait fonctionner :
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
Cela renverra au plus deux lignes. Ce n'est pas clair si vous utilisez des colonnes de type date et heure, ou si vous utilisez réellement des mots réservés comme noms de colonne, vous devrez donc vous en occuper. (J'ai omis le temps, mais vous pouvez facilement l'ajouter aux divers classements et filtrages.)
Compte tenu des critères révisés, cela devient un peu plus délicat, car l'inclusion ou l'exclusion d'une ligne dépend de la valeur renvoyée dans une ligne différente. Ici, la "deuxième" ligne, s'il y a deux lignes ou plus, n'est incluse que si la "première" ligne est égale à une valeur particulière. La méthode standard consiste à interroger les données pour obtenir la valeur maximale, puis à les interroger à nouveau tout en faisant référence au résultat du premier ensemble.
Cependant, vous pouvez faire beaucoup de choses compliquées avec row_number. Travaillez sur ceci :
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
Vous devrez résoudre le problème de date/heure, car cela ne fonctionne qu'avec les dates.