मेरा पहला सुझाव होगा कि आप अपनी कैलेंडर तालिका का उपयोग करें, यदि आपके पास एक नहीं है, तो एक बनाएं। वे बहुत उपयोगी हैं। तब आपकी क्वेरी उतनी ही सरल है:
DECLARE @MinDate DATE = '20140101',
@MaxDate DATE = '20140106';
SELECT Date
FROM dbo.Calendar
WHERE Date >= @MinDate
AND Date < @MaxDate;
यदि आप कैलेंडर तालिका नहीं बनाना चाहते हैं या नहीं बना सकते हैं, तब भी आप इसे बिना किसी पुनरावर्ती CTE के मक्खी पर कर सकते हैं:
DECLARE @MinDate DATE = '20140101',
@MaxDate DATE = '20140106';
SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1)
Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate)
FROM sys.all_objects a
CROSS JOIN sys.all_objects b;
इस पर आगे पढ़ने के लिए देखें:
- लूप के बिना एक सेट या अनुक्रम उत्पन्न करें - भाग 1
- लूप के बिना एक सेट या अनुक्रम उत्पन्न करें - भाग 2
- लूप के बिना एक सेट या अनुक्रम उत्पन्न करें - भाग 3
कर्सर में तिथियों के इस क्रम का उपयोग करने के संबंध में, मैं वास्तव में आपको एक और तरीका खोजने की सलाह दूंगा। आमतौर पर एक सेट आधारित विकल्प होता है जो बहुत बेहतर प्रदर्शन करेगा।
तो आपके डेटा के साथ:
date | it_cd | qty
24-04-14 | i-1 | 10
26-04-14 | i-1 | 20
28-04-2014 को मात्रा प्राप्त करने के लिए (जो मैं एकत्र करता हूं वह आपकी आवश्यकता है), आपको वास्तव में उपरोक्त में से किसी की भी आवश्यकता नहीं है, आप बस इसका उपयोग कर सकते हैं:
SELECT TOP 1 date, it_cd, qty
FROM T
WHERE it_cd = 'i-1'
AND Date <= '20140428'
ORDER BY Date DESC;
यदि आप इसे किसी विशेष वस्तु के लिए नहीं चाहते हैं:
SELECT date, it_cd, qty
FROM ( SELECT date,
it_cd,
qty,
RowNumber = ROW_NUMBER() OVER(PARTITION BY ic_id
ORDER BY date DESC)
FROM T
WHERE Date <= '20140428'
) T
WHERE RowNumber = 1;