假设有两个季度Q1,Q2,Q3,Q4
Q1为20160331,Q2为20160630
我需要编写一个查询来加载表,以便每次加载表时,我都需要删除给定的四分之一记录并使用给定的四分之一记录重新加载它们。
一旦我从Q1移动到Q2,我不应该触及Q1记录,只有Q2记录应该被截断并重新加载
@UseDate
是具有当前给定季度日期的变量
QuarterKey
具有加载记录的季度日期
Stg
具有当前给定的季度数据。 Stg
始终是截断重新加载
事实应删除当前的季度日期并重新加载。
IF EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[Fact]') AND type in (N'U')
AND (SELECT COUNT(*) FROM [dbo].[Fact]) >0)
BEGIN
DELETE FROM [dbo].[Fact]
WHERE (SELECT MAX(QuarterKey) FROM [Fact] ) = @UseDate
END
INSERT INTO [dbo].[Fact]
SELECT * from stg
Where (SELECT MAX(QuarterKey) FROM [Stg] ) = @UseDate
当我加载Q2时,使用此查询,Q1数据将被删除 这是我认为的一个小修正,但我无法修复它 你能帮我吗?
答案 0 :(得分:1)
如果您的@usedate的值为20160331,那么我们需要从中提取该季度,然后从具有相同四分之一的事实中删除记录。
DELETE FROM [dbo].[Fact]
WHERE Datepart(Quarter,Quarterkey) = datepart(Quarter,@useDate);
INSERT INTO [dbo].[Fact]
SELECT * from stg
Where Datepart(Quarter,Quarterkey) not in (select
datepart(Quarter,@UseDate);
如果@UseDate已经提取了季度数据
,那么效率会更高