【问题标题】:Custom Script Component SSIS to filter and merge duplicates自定义脚本组件 SSIS 以过滤和合并重复项
【发布时间】:2014-05-15 18:16:33
【问题描述】:

我有一个联系人列表,他们的信息来自两个不同的数据库,我已对其执行了 Union All 并对其进行了排序。现在我有一个汇总列表,如下所示:

contactid   add1            add2     city     phone        fullname     source
-----      -----            -----    -----    -----         -----        ----- 
BOOG1     1598 Tree Drive  Apt:215    NYC  718-888-9989   Andrew Sample    DB1
NULL      NULL             Apt:215         718-888-9989   Andrew Sample    DB2

BOOG6     1598 Tree Drive  Apt:215    NYC  718-888-8888   Andria Toefield  DB1
NULL      NULL  Apt:215                     718-888-9888   Andria Toefield  DB2
....
....
....

基本上,我想使用一个脚本组件来比较 Rows Andrew Samples,如果列为空,则选择不是的,如果存在冲突数据,则选择 db2 中的数据作为替换它的数据.所以最终的结果应该是这样的:

contactid   add1            add2     city     phone        fullname  
-----      -----            -----    -----    -----         -----          
BOOG1   1598 Tree Drive   Apt:215    NYC  718-888-9989   Andrew Sample    

BOOG6   1598 Tree Drive   Apt:215    NYC  718-888-9888    Andria Toefield  
....
....
....

我不确定如何在 C# 中开始编写脚本。我不知道如何选择行,然后比较行中的某些列。

【问题讨论】:

  • 您是在查询中还是在 SSIS 中执行了 Union all?
  • 我在 SSIS 数据流中执行了 Union All 作为转换
  • 匹配标准是什么,电话和姓名?那可能会变得丑陋。
  • 匹配是名称,然后它必须查看详细信息,其中它的 null 很简单,因为选择与该 rwo 相关的所有其他具有详细信息的列...但是其中有冲突的详细信息如果该行的两列都具有有效数据,则应将其替换为具有 db2 的列。
  • 如上例所示。

标签: c# sql-server ssis


【解决方案1】:

我不会在脚本任务中尝试这个 - 跨行比较太难了。

我会在名称列上添加一个模糊分组转换来分组。这将添加一个 _key_out 列(以及其他列)。我会将结果放入 SQL 表中。

然后我会编写一个复杂的 SQL 查询,其中包含 _key_out 列上的 GROUP BY,以及其他每个列的 CASE 语句,以解决您的“缺失”和“冲突”要求。

一旦您将其指向任何规模的真实数据集,这种设计的好处就会真正得到回报。毫无疑问,您将遇到比上述示例更复杂的场景,例如DB1 有 2 个“John Smith”行,DB2 有 3 个“John Smith”行。您将能够调整模糊分组参数和/或添加辅助模糊分组以打破平局。

在此过程中,您可以查询中间 SQL 表中的结果以优化对这些问题的处理。

【讨论】:

  • 谢谢 :) 一定会试试的。在旁注中,我将如何对派生列操作执行模糊分组,或者我会将其导入平面文件,然后使用它来读取文件?
  • 它是数据流的转换,因此您可以将其添加到派生列转换的下游。
  • 很遗憾我做不到
  • 它要求一个数据库
猜你喜欢
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
相关资源
最近更新 更多