ETL问题。
对于包含具有开始日期和结束日期的条目的给定表,检索每天计数的最佳方法是什么,包括那些可能没有在开始结束日期范围内的条目的日期。
给出表示例
Stock
ID StartDate EndDate Category
1 1/1/2013 1/5/2013 Appliances
2 1/1/2013 1/10/2013 Appliances
3 1/2/2013 1/10/2013 Appliances
需要输出
Available
Category EventDate Count
Appliances 1/1/2013 2
Appliances 1/2/2013 3
...
...
Appliances 1/10/2013 2
Appliances 1/11/2013 0
...
...
我知道的一个方法,即FOREVER,是创建一个Table变量,并运行一个While Block迭代我希望检索的范围的开始和结束,然后执行这样的查询..
Insert into @TempTable (Category,EventDate,Count)
FROM Stock
Where @CurrentLoopDate BETWEEN StartDate AND EndDate
另一种方法是在我想要填充的范围内创建日期的表或临时表,并将其与BETWEEN函数连接。
Insert into @TempTable (Category,EventDate,Count)
FROM DateTable
INNER JOIN Stock ON DateTable.[Date] BETWEEN StartDate AND EndDate
其他方法相似但使用SSIS,但基本上与上述两种解决方案相同。
任何GURU都知道更有效的方法吗?
答案 0 :(得分:2)
您是否尝试过使用递归CTE?
WITH Dates_CTE AS (
SELECT [ID]
,[StartDate]
,[EndDate]
,[Category]
FROM [dbo].[Stock]
UNION ALL
SELECT [ID]
,DATEADD(D, 1, [StartDate])
,[EndDate]
,[Category]
FROM Dates_cte d
WHERE DATEADD(D, 1, [StartDate]) <= EndDate
)
SELECT StartDate AS EventDate
,Category
,COUNT(*)
FROM Dates_CTE
GROUP BY StartDate, Category
OPTION (MAXRECURSION 0)
应该这样做; - )