【问题标题】:Rank/Rownumber function in SSIS DataflowSSIS 数据流中的 Rank/Rownumber 函数
【发布时间】:2015-01-17 11:10:28
【问题描述】:

在我的数据流中,经过一些查找后,我会得到重复的客户记录(它们不是完全重复,只有客户 ID 相同),基于客户的某些属性,如城市、位置。我需要从中选择一条记录。

如何在 SSIS 数据流中实现这一点

这里是示例数据:

;with cust (CustomerID,Cutomer_Name,score)
as 
(Select 1 as CustomerID, 'abd' as Cutomer_Name, 100 as Score
union 
select 1,'abd',null
union select 1,'abd',20
)  

select * from cust   

从这里我需要选择得分最低的记录,然后只将那一行发送到决赛桌。

用SQL中的Rownum函数很容易实现,但是这种情况发生在SSIS中的数据流过程中

【问题讨论】:

  • 您能否举一些例子说明您如何决定保留哪条记录。
  • 是的,请分享在客户 ID 重复的情况下您将用来选择正确记录的逻辑
  • 这里是示例数据:
  • 将示例数据添加到主问题

标签: sql ssis rownum


【解决方案1】:

对 SQL 命令执行源的数据访问模式。

【讨论】:

  • 我想在 SSIS 数据流任务中实现这一点...因为在一些查找之后行是重复的,而不是在源处
  • 以上是数据流中的OLE DB Source组件。
  • 数据在源不重复...在对源数据进行一些转换后开始重复...在数据流路径的中间。
  • 不要创建重复项。如果您想要更明智的答案,请为您的问题添加更多细节。
  • 我同意@Metaphor。修复错误地创建重复的逻辑。如果您想在脚本组件中做某事以了解它是如何工作的,那很好,但恕我直言,这是效率最低且可能最复杂的方法。
【解决方案2】:

使用 MultiCast 将其拆分为两个输出 - 例如 Output1 和 Output2。其中一个输出连接到聚合转换并按 CustomerId 分组并执行最低分数。现在将聚合转换的输出连接回 Output2,使用映射映射 Output2.CustomerId = Aggregate Transform.Score 和 Output2.CustomerId = Aggregate Transform.Score 中的 Merge Join。这可以解决问题,但是如果您有多个具有相同分数的 customerId,那么您可能需要在此步骤之后进行排序以删除重复项。希望这可以帮助。

【讨论】:

  • 我能找到的排名最佳技巧
【解决方案3】:

【讨论】:

  • 我不喜欢脚本任务,原因很明显......因此我仍然会使用 SSIS 任务来完成。
猜你喜欢
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
  • 2015-02-28
  • 1970-01-01
相关资源
最近更新 更多