gpt4 book ai didi

sql-server - 使用 SSIS,我如何找到人口最多的城市?

转载 作者:行者123 更新时间:2023-12-04 06:08:20 27 4
gpt4 key购买 nike

我有一个数据流任务,其中包含如下所示的信息:

Province | City    | Population
-------------------------------
Ontario | Toronto | 7000000
Ontario | London | 300000
Quebec | Quebec | 300000
Quebec | Montreal| 6000000

我如何使用聚合转换来获得每个省中人口最多的城市:
Province | City    | Population
-------------------------------
Ontario | Toronto | 7000000
Quebec | Montreal| 6000000

如果我将“Province”设置为 Group-By 列,将“Population”设置为“Max”聚合,我该如何处理 City 列?

最佳答案

完全同意@PaulStock 的观点,聚合最好留给源系统。 SSIS 中的聚合是一个完全阻塞的组件,很像排序,我有 already made my argument on that point .

但是有时在源系统中执行这些操作是行不通的。我能想到的最好的办法是基本上对数据进行双重处理。是的,ick,但我从来没有找到一种方法来不受影响地通过一个列。对于最小/最大场景,我希望将其作为一个选项,但显然像 Sum 这样的东西会使组件难以知道它所关联的“源”行是什么。

2005年

2005 年的实现看起来像这样。您的性能不会很好,实际上与良好的性能相差几个数量级,因为除了必须重新处理源数据之外,您还将在其中进行所有这些阻塞转换。

2005 aggregate

合并连接
2005 Merge Inner Join

2008年

2008 年,您可以选择使用 Cache Connection Manager这将有助于消除阻塞转换,至少在重要的地方,但您仍然需要支付双重处理源数据的成本。

将两个数据流拖到 Canvas 上。第一个将填充缓存连接管理器,并且应该是聚合发生的地方。

Warm cache connection manager

现在缓存中有聚合数据,在主数据流中删除查找任务并对缓存执行查找。

常规查找选项卡

General lookup tab

选择缓存连接管理器

Connection manager lookup tab

映射适当的列

Columns lookup tab

巨大的成功
Great success 2008 data flow

脚本任务

我能想到的第三种方法,2005 年或 2008 年,是自己编写。作为一般规则,我尽量避免脚本任务,但在这种情况下它可能是有意义的。您需要将其设为 asynchronous script transformation但只需在那里处理您的聚合。更多的代码需要维护,但您可以省去重新处理源数据的麻烦。

最后,作为一般警告,我会调查关系会对您的解决方案产生什么影响。对于这个数据集,我预计像圭尔夫这样的东西会突然膨胀并与多伦多联系在一起,但如果确实如此,包裹应该怎么做?现在,两者都会导致安大略省 2 行,但这是预期的行为吗?当然,脚本允许您定义在平局的情况下会发生什么。您可能可以通过缓存“正常”数据并将其用作查找条件并使用聚合来撤回其中一个关系,从而使 2008 年的解决方案完全站稳脚跟。 2005 可能只是通过将聚合作为合并连接的左源来做同样的事情

编辑

Jason Horner 在他的评论中有一个好主意。另一种方法是使用多播转换并在一个流中执行聚合并将其重新组合在一起。我不知道如何让它与联合一起工作,但我们可以像上面那样使用排序和合并连接。这可能是一种更好的方法,因为它为我们省去了重新处理源数据的麻烦。

enter image description here

关于sql-server - 使用 SSIS,我如何找到人口最多的城市?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8080979/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com