【问题标题】:SSIS - Find duplicate rows and keep the one with the highest valueSSIS - 查找重复行并保留具有最高值的行
【发布时间】:2019-10-22 22:23:58
【问题描述】:

我有一个平面文件,看起来像这样

┌────────┬──────────┬──────────┐ │ ITEM │ QTY_ON_HAND LOCATION│ ├────────┼──────────┼──────────┤ │ BOX │ 1 │ A │ │ 盒子 │ 0 │ B │ │ 东西 │ 1 │ C │ │ 其他 │ 2 │ A │ └────────┴──────────┴──────────┘

ITEM 可以有重复项,我需要保留 QTY_ONHAND 最高的那个(上面示例中的第一个 BOX),如果两者具有相同的值,那么我会保留任何出现。

方法:

  • 使用排序 + 删除具有重复排序值的行。排序会删除随机出现的,我不能保证最高值的会保留

  • 脚本组件。我可以在类似于this answer 的脚本组件中检测到重复项,但我必须将所有行存储在内存中,将每一行与所有存储的行集进行比较,保持最高,删除重复项并以某种方式只返回有效的行,听起来效率很低,但是,没有太多行,所以我会考虑它(我仍然不确定如何实现)。

  • 聚合转换。我知道我可以按 ITEM 对行进行分组并使用 MAX 操作来保留具有最高值的行,这是我现在正在尝试做的,但我被卡住了。

来源:

SSIS: Flat File Source to SQL without Duplicate Rows

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/581df31a-5cd0-4802-a472-7ee85c6e8464/how-does-remove-duplicates-option-in-sort-transformation-behaves?forum=sqlintegrationservices

Remove duplicate in SSIS package with preference over a column data

【问题讨论】:

  • 聚合转换应该可以解决问题。你有什么问题?
  • @Ferdipux 是的,它适用于聚合转换,我在处理某一特定列时遇到了问题,但最后一切正常,谢谢
  • 如果你在 LOCATION 上达到最大值,你会得到位置 B 的 BOX,而不是 A 所要求的。
  • 谢谢,@Nick.McDermaid,但我在数量上使用 MAX,而不是在位置上
  • 那么你必须按位置分组,这意味着你得到两行?还是 SSIS 聚合不能那样工作?

标签: ssis


【解决方案1】:

解决方案很简单,您只需添加一个聚合转换

对组中的所有行按您知道的所有其他列进行分组,并对您要使用的列应用最大操作以获取具有最高值的行。

我没有按位置分组,我知道的任何其他列的值对于每一行都会有所不同,我不需要在流程中进一步使用位置,但如果我这样做了,那么 我想我可以使用更多聚合转换我不知道。

【讨论】:

  • 这确实有效,但它需要按返回的所有内容进行分组,除了我们需要最大值的列,只要这对于正在运行的查询是可行的就可以了。我发布的连接方法不需要分组,我觉得随着查询的开发,它会更加健壮。
  • 但这将返回样本数据集的BOX | 1 | B,而不是必需的BOX | 1 | A
  • @Nick.McDermaid 我在 QTY 上使用 Max
  • 单个查询不会产生正确的答案,因为聚合是基于每列应用的。如果将 Location 添加到 Group By 子句,则结果包含两个位置的单独条目:Box/1/A 和 Box/0/B。如果该位置从组中省略,则生产正确的数量,但没有关于哪个位置可用的信息。要获取该数据,必须根据 Item 和 Qty 将这些结果连接回原始表。
【解决方案2】:

我认为在 SSIS 中直接从平面文件执行此操作很棘手,因为 SSIS 聚合步骤不会自行产生正确的结果(产生多行或无法识别正确的位置)

但是,它可以在 SQL 数据库中轻松完成,使用部分左连接,然后过滤最上面的行。 SSIS 可用于首先将数据导入临时表并从那里运行查询。

SQL 是:

select 
   i1.item,
   i1.quantity,
   i1.location 
from 
   item as i1 
   left outer join item as i2 on i1.item = i2.item and i1.quantity<i2.quantity
where 
   i2.quantity is null

如果您随后重复使用数据进行进一步处理,这种阶段/查询方法可能会更好。

如果有大量数据,还值得考虑在加载后对数据进行索引是否可以提高性能,尤其是在平面文件本身已经排序并且可以跳过索引构建方面的情况下。

在 db 中还有其他几种派生方法,但这种方法相当有效,并且可以很好地集成到更复杂的查询中。

【讨论】:

  • 如何将此 SQL 查询应用到 SSIS 中的平面文件源?
  • 要运行查询,您需要数据库中的数据,而不仅仅是平面文件中的数据 - 导入到临时表并从那里查询。我不知道聚合分组方法还建议如何处理平面文件数据。如果它是能够对输入流进行操作的 SQL 分组功能的重新实现,那么它可能比加载数据然后在数据库中查询更有效,尽管阶段/查询方法如果您随后将数据重新用于进一步处理,可能会更好。
  • 这是一种有效的方法,但答案似乎不完整,如果您将该评论移至答案,我会支持它
猜你喜欢
  • 2014-03-29
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
相关资源
最近更新 更多