TSQL - 添加缺失的日期
TSQL - Add missing dates
我有一个查询结果 table 如下所示:
select * from (select [iKey], [StartDate], [FirstFCDate] from (SELECT [iKey], min([Date]) as [FirstFCDate] from dbo.factFC group by [iKey]) as gp left outer join (select [StartDate], [Key] from dbo.iKeys) dw on gp.iKey = dw.[Key]) ft
Table1
iKey StartDate FirstFCDate
101 2017-01-13 2017-04-01
52 2016-11-11 2017-04-01
21 2017-02-23 2017-04-01
19 2014-01-21 2017-05-01
34 2016-08-18 2017-07-01
我想做的是在我的事实 table 中插入一行(一个单独的 table 称为 dbo.factProd),这样 table 上就有一个开始日期和 FirstFCDate 之间的每个日期的行。
目前,我的事实 table 看起来像这样:
factProd
ID iKey Date pAmount fcKey
1 101 2017-04-01 123 1
2 101 2017-04-01 456 2
3 101 2017-04-02 789 1
4 101 2017-04-02 103 2
5 101 2017-04-03 192 1
6 101 2017-04-03 112 2
如您所见,对于 iKey 101,factProd table 上的第一个日期是 2017-04-01(正确对应表 1 中的 FirstFCDate 列)。
我想要做的是为每个 iKey + fcKey 组合在 2017-01-13 之间的每个日期(从 StartDate 列)向此 factProd table 添加一行。
所以最终结果应该是这样的(ID 是自动生成的):
factProd
ID iKey Date pAmount fcKey
99 101 2017-01-13 0 1
100 101 2017-01-13 0 2
101 101 2017-01-14 0 1
102 101 2017-01-14 0 2
103 101 2017-01-15 0 1
104 101 2017-01-15 0 2
... ... ... ... ...
199 101 2017-03-31 0 1
200 101 2017-03-31 0 2
1 101 2017-04-01 123 1
2 101 2017-04-01 456 2
3 101 2017-04-02 789 1
4 101 2017-04-02 103 2
5 101 2017-04-03 192 1
6 101 2017-04-03 112 2
詹姆斯,
您可能会发现构建一个 CTE table 很有帮助,其中一行包含一个范围内的所有可能日期(即来自您的事实 table 的最小和最大日期),然后 LEFT加入它以查找丢失的日期。您可能还想考虑使用 LEFT JOIN, IS NULL 逻辑将 INSERTING 插入您的事实 table 中,以添加缺失的日期。您的场景比仅此复杂一点,但它可能会引导您走上一条好的道路。这是构建 table 的一些代码,实际上:
DECLARE @FromDate datetime
DECLARE @ToDate datetime
SET @FromDate = '1/1/2017'
SET @ToDate = '1/1/2018';
WITH DayTable AS (SELECT CAST(@FromDate AS DATETIME) AS theDate UNION ALL SELECT DATEADD(dd, 1, theDate) FROM DayTable s WHERE DATEADD(dd, 1, theDate) <= CAST(@ToDate AS DATETIME))
SELECT * FROM DayTable
OPTION
(MAXRECURSION 32767)
最诚挚的问候...
我有一个查询结果 table 如下所示:
select * from (select [iKey], [StartDate], [FirstFCDate] from (SELECT [iKey], min([Date]) as [FirstFCDate] from dbo.factFC group by [iKey]) as gp left outer join (select [StartDate], [Key] from dbo.iKeys) dw on gp.iKey = dw.[Key]) ft
Table1
iKey StartDate FirstFCDate
101 2017-01-13 2017-04-01
52 2016-11-11 2017-04-01
21 2017-02-23 2017-04-01
19 2014-01-21 2017-05-01
34 2016-08-18 2017-07-01
我想做的是在我的事实 table 中插入一行(一个单独的 table 称为 dbo.factProd),这样 table 上就有一个开始日期和 FirstFCDate 之间的每个日期的行。
目前,我的事实 table 看起来像这样:
factProd
ID iKey Date pAmount fcKey
1 101 2017-04-01 123 1
2 101 2017-04-01 456 2
3 101 2017-04-02 789 1
4 101 2017-04-02 103 2
5 101 2017-04-03 192 1
6 101 2017-04-03 112 2
如您所见,对于 iKey 101,factProd table 上的第一个日期是 2017-04-01(正确对应表 1 中的 FirstFCDate 列)。
我想要做的是为每个 iKey + fcKey 组合在 2017-01-13 之间的每个日期(从 StartDate 列)向此 factProd table 添加一行。
所以最终结果应该是这样的(ID 是自动生成的):
factProd
ID iKey Date pAmount fcKey
99 101 2017-01-13 0 1
100 101 2017-01-13 0 2
101 101 2017-01-14 0 1
102 101 2017-01-14 0 2
103 101 2017-01-15 0 1
104 101 2017-01-15 0 2
... ... ... ... ...
199 101 2017-03-31 0 1
200 101 2017-03-31 0 2
1 101 2017-04-01 123 1
2 101 2017-04-01 456 2
3 101 2017-04-02 789 1
4 101 2017-04-02 103 2
5 101 2017-04-03 192 1
6 101 2017-04-03 112 2
詹姆斯,
您可能会发现构建一个 CTE table 很有帮助,其中一行包含一个范围内的所有可能日期(即来自您的事实 table 的最小和最大日期),然后 LEFT加入它以查找丢失的日期。您可能还想考虑使用 LEFT JOIN, IS NULL 逻辑将 INSERTING 插入您的事实 table 中,以添加缺失的日期。您的场景比仅此复杂一点,但它可能会引导您走上一条好的道路。这是构建 table 的一些代码,实际上:
DECLARE @FromDate datetime
DECLARE @ToDate datetime
SET @FromDate = '1/1/2017'
SET @ToDate = '1/1/2018';
WITH DayTable AS (SELECT CAST(@FromDate AS DATETIME) AS theDate UNION ALL SELECT DATEADD(dd, 1, theDate) FROM DayTable s WHERE DATEADD(dd, 1, theDate) <= CAST(@ToDate AS DATETIME))
SELECT * FROM DayTable
OPTION
(MAXRECURSION 32767)
最诚挚的问候...