我正在使用数据工厂来创建暂存区域,问题是每当源数据更改时,我们都会向临时表添加新行。
例如,假设我们有以下数据:
ID Fields created edited
100 ---------- '2017-07-01' '2017-07-05'
这将存储在我们的临时表中,如下所示:
ID Fields created edited
100 ---------- '2017-07-01' null
100 ---------- '2017-07-01' '2017-07-05'
选择最近的行是昂贵的,我们不希望这样。您认为我们如何避免在暂存中存储重复的 ID?
我假设在创建管道时,如果暂存中已经存在 ID,应该有一种方法可以更新数据。
数据工厂中的查询格式如下所示:
$$Text.Format('select * from <<table>> where <<column>> >= '{0:yyyy-MM-dd HH:mm}' AND <<column>> < '{1:yyyy-MM-dd HH:mm}'', WindowStart, WindowEnd)
这里我觉得最近的记录是通过编辑列来考虑的,试试下面的代码
;WITH CTE (ID,Fields,created,edited)
AS
(
SELECT 100,'------------' ,'2017-07-01', null UNION ALL
SELECT 100,'------------ ','2017-07-01','2017-07-05'
)
SELECT ID,Fields,created,edited FROM
(
SELECT *, ROW_NUMBER()OVER(Partition by ID ORDER BY edited DESC ) RecentRecord FROM CTE
)DT
WHERE DT.RecentRecord=1
结果
ID Fields created edited
------------------------------------------
100 ------------ 2017-07-01 2017-07-05
我找到了解决问题的方法。它是这样的:
我在数据仓库中添加了一个临时表,在将数据插入暂存之前,首先数据进入这些临时表,我删除临时表中已经存在的那些,然后进行新的插入。这样,我将始终将最新数据保留在暂存区域中,并且在连接临时表以创建 DW 时不必使用 row_number(( 函数。
我不确定这是否是最好的方法,但它对我有用。