Můj první návrh by byl použít vaši kalendářovou tabulku, pokud ji nemáte, vytvořte si ji. Jsou velmi užitečné. Váš dotaz je pak stejně jednoduchý jako:
DECLARE @MinDate DATE = '20140101',
@MaxDate DATE = '20140106';
SELECT Date
FROM dbo.Calendar
WHERE Date >= @MinDate
AND Date < @MaxDate;
Pokud nechcete nebo nemůžete vytvořit tabulku kalendáře, můžete to udělat za chodu bez rekurzivního 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;
Další informace o tomto viz:
- Vygenerujte sadu nebo sekvenci bez smyček – část 1
- Vygenerujte sadu nebo sekvenci bez smyček – část 2
- Vygenerujte sadu nebo sekvenci bez smyček – část 3
S ohledem na použití této posloupnosti dat v kurzoru bych vám opravdu doporučil najít jiný způsob. Obvykle existuje alternativa založená na sadě, která bude fungovat mnohem lépe.
Takže s vašimi údaji:
date | it_cd | qty
24-04-14 | i-1 | 10
26-04-14 | i-1 | 20
Chcete-li získat množství dne 28. 4. 2014 (zjišťuji, že je to váš požadavek), ve skutečnosti nepotřebujete nic z výše uvedeného, můžete jednoduše použít:
SELECT TOP 1 date, it_cd, qty
FROM T
WHERE it_cd = 'i-1'
AND Date <= '20140428'
ORDER BY Date DESC;
Pokud to pro konkrétní položku nechcete:
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;