我有一个临时表,其中包含从数据文件中获取的一系列数据行。
每行详细说明了对远程系统中某行的更改,这些行实际上是每次更改后获取的源行的快照。每行包含用于创建和更新的元数据时间戳。
我现在正在尝试从包含所有更新的这些数据文件构建更新表。我需要一种方法来删除具有重复键的行,只保留具有最新“更新”时间戳的行。
我知道我可以使用SSIS“sort”转换通过对关键字段进行排序并告诉它删除重复项来删除重复项,但是如何确保它保留的行是具有最新时间戳的行?
答案 0 :(得分:0)
您可以使用SSIS中的排序转换按多列对数据集进行排序。只需按主键(或ID字段)排序,然后按降序排列时间戳列。
有关使用排序转换的更多详细信息,请参阅以下文章?
http://msdn.microsoft.com/en-us/library/ms140182.aspx
有意义吗?
干杯,约翰
答案 1 :(得分:0)
这将删除Col1,Col2等匹配的行,并且具有不是最新的UpdateDate:
DELETE D
FROM MyTable AS D
JOIN MyTable AS T
ON T.Col1 = D.Col1
AND T.Col2 = D.Col2
...
AND T.UpdateDate > D.UpdateDate
如果Col1和Col2需要被认为是“匹配”,如果它们都是NULL,那么你需要使用:
ON (T.Col1 = D.Col1 OR (T.Col1 IS NULL AND D.Col1 IS NULL))
AND (T.Col2 = D.Col2 OR (T.Col2 IS NULL AND D.Col2 IS NULL))
...
编辑:如果您需要对Case IN 敏感数据库进行区分大小写测试,则在VARCHAR和TEXT列上使用:
ON (T.Col1 = D.Col1 COLLATE Latin1_General_BIN
OR (T.Col1 IS NULL AND D.Col1 IS NULL))
...
答案 2 :(得分:0)
从登台转到最终牌桌时,忽略重复是否有意义?
无论如何你必须这样做,那么为什么不对登台表而不是两个发出一个查询呢?
INSERT final
(key, col1, col2)
SELECT
key, col1, col2
FROM
staging s
JOIN
(SELECT key, MAX(datetimestamp) maxdt FROM staging ms ON s.key = ms.key AND s.datetimestamp = ms.maxdt