Něco jako následující by mělo fungovat:
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
Tím se vrátí maximálně dva řádky. Není jasné, zda používáte sloupce s datovým typem Datum a čas, nebo zda ve skutečnosti používáte vyhrazená slova jako názvy sloupců, takže si s tím budete muset lámat hlavu. (Vynechal jsem čas, ale můžete jej snadno přidat k různým řazením a filtrování.)
Vzhledem k revidovaným kritériím je to trochu složitější, protože zahrnutí nebo vyloučení řádku závisí na hodnotě vrácené v jiném řádku. Zde je „druhý“ řádek, pokud existují dva nebo více řádků, zahrnut pouze v případě, že „první“ řádek odpovídá konkrétní hodnotě. Standardním způsobem, jak toho dosáhnout, je dotazovat se na data, abyste získali maximální hodnotu, a poté se na ně dotazovat znovu a odkazovat na výsledek první sady.
S row_number však můžete dělat spoustu špinavých věcí. Pracujte na tomto:
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
Budete muset vyřešit problém s datem a časem, protože to funguje pouze proti datům.