Iets als het volgende zou moeten werken:
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
Dit levert maximaal twee rijen op. Het is niet duidelijk of u kolommen met datum- en tijdgegevens gebruikt, of dat u gereserveerde woorden als kolomnamen gebruikt, dus daar zult u zich mee bezig moeten houden. (Ik heb Tijd weggelaten, maar dat zou je gemakkelijk kunnen toevoegen aan de verschillende volgordes en filteringen.)
Gezien de herziene criteria wordt het een beetje lastiger, omdat het opnemen of uitsluiten van een rij afhankelijk is van de waarde die in een andere rij wordt geretourneerd. Hier wordt de "tweede" rij, als er twee of meer rijen zijn, alleen opgenomen als de "eerste" rij gelijk is aan een bepaalde waarde. De standaardmanier om dit te doen, is door de gegevens op te vragen om de maximale waarde te krijgen en deze vervolgens opnieuw op te vragen terwijl u verwijst naar het resultaat van de eerste set.
Je kunt echter veel gekke dingen doen met row_number. Werk hieraan:
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
U moet het datum/tijd-probleem oplossen, aangezien dit alleen werkt voor datums.