SQL-当前季度数据必须被截断并重新加载,但上一季度应保持不变

时间:2017-07-28 06:10:32

标签: sql sql-server ssis

假设有两个季度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数据将被删除 这是我认为的一个小修正,但我无法修复它 你能帮我吗?

1 个答案:

答案 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已经提取了季度数据

,那么效率会更高