我有一个表格,其中有一列ID
,Date
和Frequency
出现在那个特定的date
和ID
。
ID date Frequency
1 2014-05-18 5
1 2014-05-19 4
1 2014-05-20 25
2 2014-05-20 7
3 2014-05-18 4
3 2014-05-20 1
4 2014-05-18 6
我希望为每个ID
当前不存在的日期插入日期(假设日期范围从2014-05-18
到2014-05-20
)并为这些添加一个值 0 Frequency
。
例如,您可以看到
ID
1 对所有三个日期都有观察;
ID
2 缺失2014-05-18
和2014-05-19
;
ID
3 缺失2014-05-19
;
ID
4 缺失2014-05-19
和2014-05-20
.
因此,输出应如下所示
ID date Frequency
1 2014-05-18 5
1 2014-05-19 4
1 2014-05-20 25
2 2014-05-18 0
2 2014-05-19 0
2 2014-05-20 7
3 2014-05-18 4
3 2014-05-19 0
3 2014-05-20 1
4 2014-05-18 6
4 2014-05-19 0
4 2014-05-20 0
我从这个问题尝试了以下内容。但是,这只会添加Frequency
不存在于整个表中而不是在一个ID
级别上的 0 日期。
DECLARE @s DATE = '20140518', @e DATE = '20140520'; SELECT c.date, Frequency = COALESCE(a.Frequency,0) FROM dbo.Calendar AS c LEFT OUTER JOIN dbo.table AS a ON c.date = s.[date] WHERE c.d >= @s AND c.d < DATEADD(DAY, 1, @e);
使用上面的基本示例查询,此代码应该可以满足您的需求。重要变化:
编码:
假设此表/数据:
您需要生成范围内的日期列表,然后为每个日期生成一行,并结合您范围内存在的每个唯一 ID,然后将该输出外部连接到您的实际数据。
一个可能稍微更有效的替代方案:
输出:
递归 CTE 的一个问题是,如果您需要支持大于 100 天的日期范围,则需要添加
OPTION (MAXRECURSION n)
.