加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2021-02-02 23:01:52 所属栏目:MsSql教程 来源:网络整理
导读:我有一个数据流任务,其信息看起来像这样: Province | City | Population-------------------------------Ontario | Toronto | 7000000Ontario | London | 300000Quebec | Quebec | 300000Quebec | Montreal| 6000000 如何使用聚合转换来获得每个省人口最多的

我有一个数据流任务,其信息看起来像这样:

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

如何使用聚合转换来获得每个省人口最多的城市:

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

如果我将“省”设置为“分组依据”列,将“人口”设置为“最大”汇总,我该如何处理“城市”列?

解决方法

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

但有时在源系统中执行这些操作却无法正常工作.我能想到的最好的方法是基本上对数据进行双重处理.是的,ick但是我从来没有找到过通过未受影响的列的方法.对于Min / Max场景,我希望将其作为一个选项,但显然像Sum这样的东西会让组件很难知道它所绑定的“源”行是什么.

2005年

2005年的实施将如下所示.你的性能不会很好,事实上好几个数量级,因为除了必须重新处理你的源数据之外你还会有所有这些阻塞变换.

合并加入

2008年

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

将两个数据流拖到画布上.第一个将填充缓存连接管理器,并且应该是聚合发生的位置.

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

常规查找选项卡

选择缓存连接管理器

映射相应的列

巨大的成功

脚本任务

我能想到的第三种方法,无论是2005年还是2008年,都是自己写的.作为一般规则,我试图避免脚本任务,但这是一个可能有意义的情况.您需要将它设为asynchronous script transformation,但只需处理您的聚合.需要维护更多代码,但您可以省去重新处理源数据的麻烦.

最后,作为一般警告,我将调查关系对您的解决方案的影响.对于这个数据集,我希望像Guelph这样的东西突然膨胀并与多伦多联系,但如果确实如此,该包应该做什么?现在,两个都会导致安大略省的两排,但这是预期的行为吗?当然,脚本允许您定义在关系情况下发生的情况.您可以通过缓存“正常”数据并将其用作查找条件并使用聚合来拉回其中一个关系,从而使2008解决方案成为可能. 2005可以通过将聚合作为合并连接的左源来完成相同的操作

编辑

杰森霍纳在评论中有个好主意.另一种方法是使用多播转换并在一个流中执行聚合并将其重新组合在一起.我无法弄清楚如何使它与联合使用,但我们可以使用排序和合并连接,就像上面一样.这可能是一种更好的方法,因为它为我们省去了重新处理源数据的麻烦.

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读