teradata递归查询场景

teradata recursive query scenario

我有一个输入 table 如下

Order_id    previous_order_id   ordertype_opprotunity   global_order_id
 103        102                "in progress"            11111
 102        101                "in progress             22222
 101        xx                 "new order"              33333

我需要递归检查 order_id 和 previous_order_id 直到 ordertype_opprotunity 匹配 "new_order" 然后选择 global_order_id.[=16= 的值] 例如,对于 103 prev 是 102 然后对于 102 prev 是 101 对于 101 ordertype_opprotunity 是 "new order" 并且值为 33333.
输出会像

Order_id  global_order_id
103       33333

有几种方法可以获得预期的结果。

您可以从 "last" 顺序开始,沿着链向上直到找到 'new order':

WITH RECURSIVE cte AS
 (
   SELECT t.*, Order_id AS baseOrder_id
   FROM tab AS t
   WHERE NOT EXISTS -- last order in chain
    (
      SELECT * 
      FROM tab AS t2
      WHERE t.Order_id = t2.previous_order_id
    )

   UNION ALL

   SELECT t.*, cte.baseOrder_id
   FROM tab AS t
   JOIN cte 
     ON t.Order_id = cte.previous_order_id 
   WHERE cte.ordertype_opprotunity <> 'new order' -- stop when the previous recursion was a "new order"
 )
SELECT * FROM cte
WHERE ordertype_opprotunity = 'new order' -- only return the "new order" type