SQL - 从最新的快照数据创建历史事实表

时间:2013-11-14 14:02:55

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

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

我有一张桌子,我们称之为 Table One 。每个 ID 都有一个生效日期范围 日期时间(这些实际上是DATETIME类型,即使我在下面奇怪地展示了它们)日期A 日期B 。例如,ID 1从11月1日到11月3日生效。

enter image description here

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

enter image description here

为了实现这一目标,我还有一个包含连续日期的表格,其中包含日期的字符串格式,以及开始日期时间和结束日期时间:

enter image description here

我的经验主要是使用C#,虽然我可以编写一个脚本来实现这一目标,但我担心我会破解纯SQL可以实现的目标。

3 个答案:

答案 0 :(得分:1)

您需要什么作为日历表 - 就像您拥有但使用实际的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(或相关数据类型),并让客户对其进行格式化。

答案 1 :(得分:1)

你可以通过连接来实现,但考虑到你的数据类型,它有点复杂。最好的方法是在表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 :(得分:1)

这是一个与其他解决方案类似的解决方案。我确实有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