我有一个临时表,其中包含从数据文件中获取的一系列数据行。

每行详细说明了对远程系统中某行的更改,这些行实际上是每次更改后获取的源行的快照。每行包含用于创建和更新的元数据时间戳。

我现在正在尝试从包含所有更新的这些数据文件构建更新表。我需要一种方法来删除具有重复键的行,只保留具有最新“更新”的行。时间戳。

我知道我可以使用SSIS“排序”转换为通过对键字段进行排序并告诉它删除重复项来删除重复项,但是如何确保它保留的行是具有最新时间戳的行?

有帮助吗?

解决方案

这将删除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))
       ...

其他提示

您可以使用SSIS中的排序转换按多列对数据集进行排序。只需按主键(或ID字段)排序,然后按降序排列时间戳列。

有关使用排序转换的更多详细信息,请参阅以下文章?

http://msdn.microsoft.com/en-us/library /ms140182.aspx

有意义吗?

干杯,约翰

从登台转到最终牌桌时,忽略重复是否有意义?

无论如何你必须这样做,那么为什么不对登台表而不是两个发出一个查询呢?

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top