Oracle11g 如何在聚合器转换信息中选择最小非零数?

Oracle11g 如何在聚合器转换信息中选择最小非零数?,oracle11g,informatica-powercenter,Oracle11g,Informatica Powercenter,我已经进行了聚合器转换。它根据代码对数据进行分组,距离按降序排列。因此,我们只能根据距离选择行。通常聚合器将最后一行作为输出。因此,在案例1中,它将距离为0的最后一行作为输出,但是它必须将距离为25的最小非零距离的行作为输出。对于案例2和案例3,它可以正常工作。 案例2的规则:它将选择距离为0的最后一行。 案例3的规则:它将选择最后一行的最小非零距离 案例1 CODE APP-NO DISTANCE A 120 121 A 124

我已经进行了聚合器转换。它根据代码对数据进行分组,距离按降序排列。因此,我们只能根据距离选择行。通常聚合器将最后一行作为输出。因此,在案例1中,它将距离为0的最后一行作为输出,但是它必须将距离为25的最小非零距离的行作为输出。对于案例2和案例3,它可以正常工作。 案例2的规则:它将选择距离为0的最后一行。 案例3的规则:它将选择最后一行的最小非零距离

案例1

CODE   APP-NO    DISTANCE
A      120         121 
A      124         25 
A      125         0
A      126         0

OUTPUT:
CODE   APP-NO    DISTANCE
A      124         25
案例2

CODE   APP-NO    DISTANCE
A      120         0 
A      124         0 
A      125         0
A      126         0

OUTPUT:
CODE   APP-NO    DISTANCE
A      120         0 
案例3

CODE   APP-NO    DISTANCE
A      120         4 
A      124         3 
A      125         2
A      126         1

OUTPUT:
CODE   APP-NO    DISTANCE
A      126         1 

如果您位于距离非零的第一行或所有行均为0的“第一”行之后,则这可能会起到以下作用:

with sample_data as (select 'A' code, 120 app_no, 0 distance from dual union all
                     select 'A' code, 124 app_no, 0 distance from dual union all
                     select 'A' code, 125 app_no, 25 distance from dual union all
                     select 'A' code, 126 app_no, 121 distance from dual union all
                     select 'B' code, 120 app_no, 0 distance from dual union all
                     select 'B' code, 124 app_no, 0 distance from dual union all
                     select 'B' code, 125 app_no, 0 distance from dual union all
                     select 'B' code, 126 app_no, 0 distance from dual union all
                     select 'C' code, 120 app_no, 1 distance from dual union all
                     select 'C' code, 124 app_no, 2 distance from dual union all
                     select 'C' code, 125 app_no, 3 distance from dual union all
                     select 'C' code, 126 app_no, 4 distance from dual)
-- end of setting up a subquery that mimics a table with data in it. See SQL below:
select code,
       app_no,
       distance
from   (select code,
               app_no,
               distance,
               row_number() over (partition by code order by distance, app_no) rn1,
               case when distance > 0 
                         then row_number() over (partition by code, case when distance > 0 then code end order by distance, app_no)
                    else null
               end rn2,
               max(distance) over (partition by code) max_distance
        from   sample_data)
where  rn2 = 1
or     (max_distance = 0 and rn1 = 1);

CODE     APP_NO   DISTANCE
---- ---------- ----------
A           125         25
B           120          0
C           120          1

要显示给定代码的所有行,其中所有行(即情况2)的距离均为0,而不仅仅是第一行,这很容易-您只需从上述查询中删除和rn1=1

因此,新查询将类似于:

with sample_data as (select 'A' code, 120 app_no, 0 distance from dual union all
                     select 'A' code, 124 app_no, 0 distance from dual union all
                     select 'A' code, 125 app_no, 25 distance from dual union all
                     select 'A' code, 126 app_no, 121 distance from dual union all
                     select 'B' code, 120 app_no, 0 distance from dual union all
                     select 'B' code, 124 app_no, 0 distance from dual union all
                     select 'B' code, 125 app_no, 0 distance from dual union all
                     select 'B' code, 126 app_no, 0 distance from dual union all
                     select 'C' code, 120 app_no, 1 distance from dual union all
                     select 'C' code, 124 app_no, 2 distance from dual union all
                     select 'C' code, 125 app_no, 3 distance from dual union all
                     select 'C' code, 126 app_no, 4 distance from dual)
-- end of setting up a subquery that mimics a table with data in it. See SQL below:
select code,
       app_no,
       distance
from   (select code,
               app_no,
               distance,
               case when distance > 0 
                         then row_number() over (partition by code, case when distance > 0 then code end order by distance, app_no)
                    else null
               end rn,
               max(distance) over (partition by code) max_distance
        from   sample_data)
where  rn = 1
or     max_distance = 0;

CODE     APP_NO   DISTANCE
---- ---------- ----------
A           125         25
B           120          0
B           124          0
B           125          0
B           126          0
C           120          1

这需要两个步骤:聚合以获得最小非零距离
和相应的
APP-NO
。因此:

在Aggreator转换组中,按代码并获得正确的距离:

  • minNonZeroDist=
    MIN(距离,距离!=0)
现在,您需要使用另一个聚合器转换准备第二个管道,按代码分组并获得正确的应用程序号。创建两个输出端口:

  • minApp=
    MIN(应用程序编号)
  • minNonZeroDistAPP=
    MIN(应用号,距离!=0)
并将两种骨料连接在一起。使用以下端口创建一个Joiner转换

  • 聚合代码-链路第一聚合器输出代码
  • 聚合距离-链路第一聚合器输出距离
  • agg2_代码-从第二个聚合器链接代码
  • agg2_距离-链接到第二个聚合器的距离
  • agg2_minApp-从第二个聚合器链接minApp
  • agg2_minNonZeroDistAPP-从第二个聚合器链接minNonZeroDistAPP
添加两个联接条件:

  • 非聚集代码=聚集代码
  • 非聚集距离=聚集距离
现在使用表达式转换来选择正确的APP-NO,使用类似于
IIF(ISNULL(agg2\u minNonZeroDistAPP)、agg2\u minonapp、agg2\u minNonZeroDistAPP)的公式
。这应该可以解决问题


注意:确保数据按
code
DISTANCE
排序,并使用
sorted Input
属性进行Joiner转换。

预期输出背后的逻辑是什么?你有什么查询对案例2和3有效,但对案例1无效?我尝试了你给出的查询,但是需要测试它。工作正常。在informatica中,我使用聚合器,它只是按照距离的降序对代码进行分组,并在所有三种情况下将最后一行作为输出传递,但是在情况1中它发送了错误的输出。谢谢你的提问,谢谢Boneist的提问。然而,代码的价值可以是任何东西。我们必须根据代码组成一个小组,然后我们有三个案例。所有这三种情况都应该在查询中实现。对,这就是我所做的。我只是按照代码进行分组,每个代码代表不同的情况。如果将
where code='A'
添加到上述查询中,您将得到案例1的结果。如果您添加了
,其中code='B'
,您将得到案例2,等等。以什么方式不符合您的要求?顺便说一下,你还没有解释。我只是猜测了你想要什么,但实际上,如果你请求别人帮助(特别是免费的),你应该提供尽可能多的信息。逻辑上有一个变化,我们必须通过案例2,其中我们的距离都是零。那么你能建议对查询进行修改吗。筛选器不应应用于这种情况2,所有零都必须通过。这很简单-您只需从原始查询的where子句中删除
和rn1=1
。我已经更新了我的答案以包含查询的新版本。在这种情况下,我将错过距离值为零的代码组。我们有三个箱子。情况1:距离的所有非零值。输出应为最小值非零。案例2:一些非零和一些零。输出应为最小值非零。案例3:所有零距离。输出可以是任何零。谢谢Maciejg,让我重新表述我的查询。代码应用-无距离A 120 0 A 124 0 A 125 25 A 126 121输出:代码应用-无距离A 125 25案例2代码应用-无距离A 120 0 A 124 0 A 125 0 A 126 0输出:代码应用-无距离A 120 0案例3代码APP-NO DISTANCE A 120 1 A 124 2 A 125 3 A 126 4输出:代码APP-NO DISTANCE A 120 1老实说,我看不出任何区别(在重新格式化注释中的数据后)。我仍然认为上述问题应该解决。请明确指出问题所在。对于上面的不完整评论,我深表歉意,请参考问题,我已经添加了额外的信息,这将有助于达成解决方案。好的,因为min APPNO与min DISTANCE不一致,它改变了整件事。请查看我的最新回复,并告诉我是否还有您需要涵盖的内容。