将日期范围值加载到每日谷物事实表

时间:2013-10-23 22:48:24

标签: sql tsql ssis etl dimension

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都知道更有效的方法吗?

1 个答案:

答案 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)

应该这样做; - )