【问题标题】:SQL - Creating a historical fact table from latest snapshot dataSQL - 从最新的快照数据创建历史事实表
【发布时间】:2013-11-14 14:02:55
【问题描述】:

我目前正在研究一个有趣的问题,尽管我会分享它以征求意见。

我有一张桌子,我们称之为Table One。每个 ID 都有一个由 datetimes 暗示的有效日期范围(这些实际上是 DATETIME 类型,尽管我在下面奇怪地介绍了它们)日期 A日期 B。例如,ID 1 从 11 月 1 日到 11 月 3 日有效。

从这个表中,我想生成一个类似于目标表的表(如下图所示),其中每个 ID/有效日期组合逐行列出:

为了做到这一点,我还有一个包含连续日期的表格,日期的字符串格式,以及开始日期时间和结束日期时间:

我的经验主要是使用 C#,虽然我可以编写一个脚本来完成这一点,但我担心我会在使用纯 SQL 可以完成的事情上进行破解。

【问题讨论】:

    标签: sql sql-server sql-server-2008 datetime business-intelligence


    【解决方案1】:

    您可以通过连接来完成,但考虑到您的数据类型,这有点令人费解。最好的做法是在表一中使用具有 DATE 数据类型的列,而不是字符串。然后你可以做这样的事情:

    SELECT t2.DateStr, t1.Id
    FROM TableOne t1
    JOIN TableTwo t2 ON t2 StartDatetime BETWEEN t1.DateA AND t1.DateB
    ORDER BY t2.DateStr, t1.Id;
    

    【讨论】:

    • 谢谢!它们实际上是“表一”中的日期时间,很抱歉我对它们的呈现方式与“表二”中的不同——但它们是相同的数据类型。
    【解决方案2】:

    您需要的日历表 - 就像您拥有的一样,但使用实际的 DATETIME,然后将您的数据作为

    加入其中
    SELECT c.ShortDate, t.Id, t.StartDate, t.EndDate
    FROM dbo.Calendar c
    JOIN tbl t ON c.ShortDate BETWEEN t.StartDate AND t.EndDate
    ORDER BY c.ShortDate, t.Id
    

    旁注:将所有日期保留为DATETIME(或相关数据类型)并让客户端对其进行格式化。

    【讨论】:

    • 法语:les grands esprits se rencontrent :)
    • @t-i 也谢谢!它们实际上是“表一”中的日期时间,很抱歉我对它们的呈现方式与“表二”中的不同——但它们是相同的数据类型。
    【解决方案3】:

    这是一个与其他解决方案类似的解决方案。我确实有一个SQL Fiddle,不过,我花了太长时间创建它,但它的价值。

    SELECT ds.datestr, t1.id 
    FROM DateStrings ds
    INNER JOIN TableOne t1 
        ON ds.startdate BETWEEN t1.startdate AND t1.EndDate
    ORDER BY datestr
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 2014-08-23
      • 2018-03-25
      • 2020-11-17
      • 2010-11-30
      • 1970-01-01
      • 2023-03-06
      相关资源
      最近更新 更多