निम्नलिखित की तरह कुछ काम करना चाहिए:
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
यह अधिकतम दो पंक्तियों में वापस आ जाएगा। यह स्पष्ट नहीं है कि आप दिनांक और समय डेटाटाइप किए गए कॉलम का उपयोग कर रहे हैं, या यदि आप वास्तव में आरक्षित शब्दों का उपयोग कॉलम नामों के रूप में कर रहे हैं, तो आपको इसके साथ झगड़ा करना होगा। (मैंने समय छोड़ दिया है, लेकिन आप इसे आसानी से विभिन्न ऑर्डरिंग और फ़िल्टरिंग में जोड़ सकते हैं।)
संशोधित मानदंड को देखते हुए, यह थोड़ा पेचीदा हो जाता है, क्योंकि एक पंक्ति का समावेश या बहिष्करण एक अलग पंक्ति में दिए गए मान पर निर्भर करता है। यहां, "दूसरी" पंक्ति, यदि दो या दो से अधिक पंक्तियाँ हैं, केवल तभी शामिल की जाती हैं जब "पहली" पंक्ति किसी विशेष मान के बराबर हो। ऐसा करने का मानक तरीका अधिकतम मान प्राप्त करने के लिए डेटा को क्वेरी करना है, फिर पहले सेट के परिणाम को संदर्भित करते हुए इसे फिर से क्वेरी करना है।
हालाँकि, आप 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
आपको दिनांक/समय की समस्या का समाधान करना होगा, क्योंकि यह केवल तिथियों के विरुद्ध कार्य करता है।