【问题标题】:Remove duplicate from a staging file从暂存文件中删除重复项
【发布时间】:2009-03-06 14:30:43
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: sql-server ssis


    【解决方案1】:

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

    编辑:如果您需要在区分大小写 IN 的数据库上进行区分大小写的测试,那么在 VARCHAR 和 TEXT 列上使用:

           ON (T.Col1 = D.Col1  COLLATE Latin1_General_BIN 
               OR (T.Col1 IS NULL AND D.Col1 IS NULL))
           ...
    

    【讨论】:

      【解决方案2】:

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

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

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

      有意义吗?

      干杯,约翰

      【讨论】:

        【解决方案3】:

        在从登台转移到决赛桌时忽略重复是否有意义?

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

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-27
          • 2013-12-13
          • 1970-01-01
          • 1970-01-01
          • 2023-03-17
          • 2013-11-12
          相关资源
          最近更新 更多