Sesuatu seperti berikut ini akan berfungsi:
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
Ini akan mengembalikan paling banyak dua baris. Tidak jelas apakah Anda menggunakan kolom tipe data Tanggal dan Waktu, atau jika Anda benar-benar menggunakan kata-kata yang dicadangkan sebagai nama kolom, jadi Anda harus repot dengan itu. (Saya meninggalkan Waktu, tetapi Anda dapat dengan mudah menambahkannya ke berbagai urutan dan pemfilteran.)
Mengingat kriteria yang direvisi, ini menjadi sedikit lebih rumit, karena penyertaan atau pengecualian suatu baris bergantung pada nilai yang dikembalikan di baris yang berbeda. Di sini, baris "kedua", jika ada dua baris atau lebih, dimasukkan hanya jika baris "pertama" sama dengan nilai tertentu. Cara standar untuk melakukannya adalah dengan mengkueri data untuk mendapatkan nilai maksimal, lalu mengkuerinya lagi sambil mereferensikan hasil set pertama.
Namun, Anda dapat melakukan banyak hal gila dengan row_number. Kerjakan ini:
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
Anda harus menyelesaikan masalah tanggal/waktu, karena ini hanya berfungsi pada tanggal.