Một cái gì đó như sau sẽ hoạt động:
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
Điều này sẽ trả về nhiều nhất là hai hàng. Nó không rõ ràng nếu bạn đang sử dụng các cột được định kiểu dữ liệu Ngày và Giờ, hay nếu bạn thực sự đang sử dụng các từ dành riêng làm tên cột, vì vậy bạn sẽ phải phiền phức với điều đó. (Tôi đã bỏ qua Thời gian, nhưng bạn có thể dễ dàng thêm nó vào các thử thách và chuỗi lọc khác nhau.)
Với các tiêu chí đã sửa đổi, nó sẽ phức tạp hơn một chút, vì việc bao gồm hoặc loại trừ một hàng phụ thuộc vào giá trị được trả về trong một hàng khác. Ở đây, hàng "thứ hai", nếu có hai hoặc nhiều hàng, chỉ được đưa vào nếu hàng "đầu tiên" bằng một giá trị cụ thể. Cách tiêu chuẩn để thực hiện việc này là truy vấn dữ liệu để nhận giá trị tối đa, sau đó truy vấn lại nó trong khi tham chiếu kết quả của tập hợp đầu tiên.
Tuy nhiên, bạn có thể làm rất nhiều điều rắc rối với row_number. Làm việc này:
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
Bạn sẽ phải giải quyết vấn đề ngày / giờ, vì điều này chỉ hoạt động với ngày tháng.