【问题标题】:Recursive query and summorize rows DB2递归查询和汇总行 DB2
【发布时间】:2018-07-16 16:26:46
【问题描述】:

您好,我有下表:

表格代码

  A     B     C     D
test    10    1     NEW
test2   1     5     NEW
test3   5     2     OLD
test4   40    3     NEW
test5   8     7     NEW
test6   7     9     OLDER

结果应该是这样的

  A        B      C     D      E
test     10      1     NEW    OLD
test2    1       5     NEW    OLD
test3    5       2     OLD
test4    40      3     NEW
test5    8       7     NEW   OLDER
test6    7       9     OLDER

逻辑:

如果 D 是新的,我检查 C 并查看该值是否在 B 中。如果不是,则该行已完成。 如果有一个条目,我检查 D 是否是新的,如果是,则新的 C 是否在另一行的 B 中,依此类推,直到我找到 C 值为 B 且 D 不是新的。 我需要获取该值并将其放在受该 saerch 影响的其他行的 D 列中。

我有什么:

with CODE (A, B, C, D, E) AS
(SELECT Original.A, Original.B, Original.C, Original.D, '' 
from myschema.basetable Original where Original.D = 'CORIPD'
UNION ALL
Select lookup.A, lookup.B, lookup.C, lookup.D, '' 
from CODE Original, myschema.basetable lookup 
where Original.A = lookup.A and Original.C =  lookup.B
UNION ALL
Select lookup_next.A, lookup_next.B, lookup_next.C, '' D, lookup_next.D E
from CODE Original, myschema.basetable lookup_next 
where Original.A = lookup_next.A and Original.C =  lookup_next.B and lookup_next.C IS NULL
)
select A, B, C, D, E from CODE 
order by A, C, D

目前的结果:

  A        B      C     D      E
test     10      1     NEW    
test2    1       5     NEW    
test3    5       2     OLD
test3    5       2            OLD
test4    40      3     NEW
test5    8       7     NEW   
test6    7       9     OLDER
test6    7       9            OLDER

系统是 Windows IBM DB2 10.5

感谢您提供的任何帮助。

【问题讨论】:

    标签: sql sorting recursion db2


    【解决方案1】:

    一个可能的解决方案 - 我在示例中使用了 rectest 作为表 ame

    with temp (i,a,b,c,d,e) as (
    select 1 as i, a,b,c,d, cast('-' as varchar(10)) as e
      from rectest 
     where D <> 'NEW'
    union all
    select t.i + 1 as i, r.a, r.b, r.c, r.d
         , case when t.i = 1 then t.d
                when t.i > 1 and t.e <> '-' then t.e
                else '-' 
           end as e            
      from temp t,
           rectest r
     where t.b = r.c
     and t.i < 5
    )
    , temp2 as (
    select a,b,c,d,e from temp
    )
    select * from temp2
    union all
    select a,b,c,d, '-' as e from rectest 
     where a not in (select a from temp2) 
    order by a;
    

    第二个 CTE 只需要获取没有依赖行的行(这不是 recorsion 的一部分 - 在您的示例 test4 中。

    【讨论】:

    • 它朝着正确的方向前进,但现在结果表是:ABCDE test 10 1 OLD test 1 5 OLD test 10 1 OLDER test1 1 5 OLDER 它会生成所有可能的 OLD 版本的结果。跨度>
    • OK 添加 r.a = t.a 后,它就像一个魅力。感谢您的所有帮助。
    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 2011-02-18
    • 2021-11-16
    • 2017-01-19
    • 1970-01-01
    • 2020-12-10
    • 2023-02-12
    • 2021-12-08
    相关资源
    最近更新 更多