次のようなものが動作するはずです:
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
これにより、最大 2 行が返されます。日付と時刻のデータ型の列を使用しているかどうか、または実際に列名として予約語を使用しているかどうかは明確ではないため、それについては大騒ぎする必要があります。 (時間は省略しましたが、さまざまな順序付けとフィルタリングに簡単に追加できます。)
行を含めるか除外するかは別の行で返される値に依存するため、修正された基準を考えると、少し複雑になります。ここで、「2 行目」の行は、2 行以上ある場合、「1 行目」の行が特定の値に等しい場合にのみ含まれます。これを行う標準的な方法は、データを照会して最大値を取得し、最初のセットの結果を参照しながら再度照会することです。
ただし、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
これは日付に対してのみ機能するため、日付/時刻の問題を解決する必要があります。