【问题标题】:Loading Date Range Values to a Daily Grain Fact Table将日期范围值加载到每日谷物事实表
【发布时间】:2013-10-23 22:48:24
【问题描述】:

这里有 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 块,遍历我希望检索的范围的开始和结束,然后执行这样的查询..

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

【问题讨论】:

    标签: sql tsql ssis etl dimension


    【解决方案1】:

    您是否尝试过使用递归 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)
    

    这应该可以解决问题 ;-)

    【讨论】:

    • 这就是我最终解决这个问题的方法。谢谢你的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多