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
我有一个输入 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