【问题标题】:Getting non-deterministic results from WITH RECURSIVE cte从 WITH RECURSIVE cte 获得不确定的结果
【发布时间】:2020-07-13 18:59:40
【问题描述】:

我正在尝试创建一个递归 CTE,它遍历给定 ID 的所有记录,并在有序记录之间执行一些操作。假设我有一家银行的客户被收取了可唯一识别的费用,而客户可以分期支付该费用:

WITH recursive payments ( 
         id
       , index
       , fees_paid
       , fees_owed
       )
  
  AS (
  
  SELECT id
       , index
       , fees_paid
       , fee_charged
    FROM table
   WHERE index = 1
    
   UNION ALL
    
  SELECT t.id
       , t.index
       , t.fees_paid
       , p.fees_owed - p.fees_paid 
    FROM table t
    JOIN payments p
      ON t.id = p.id
     AND t.index = p.index + 1
  )

  SELECT * 
    FROM payments 
ORDER BY 1,2;

连接逻辑看起来不错,但是当我将此查询的输出连接到源表时,我得到了不确定和不正确的结果。

这是我第一次尝试 Snowflake 的递归 CTE。我在导致此处的不确定性的中间结果逻辑中遗漏了什么?

【问题讨论】:

  • 在 2 个表中提供示例数据、您期望的结果以及您获得的结果可能会有所帮助。这将有助于其他人尝试复制问题并为您解决问题。
  • 感谢您的建议 - 我绝对应该发布一些示例数据和预期结果。原谅我 - 我是 stackoverflow 的新手。在剥离层并查看中间结果时,我认为 CTE 本身不是问题,因此我感到沮丧和困惑。非确定性来自此查询的视图。

标签: snowflake-cloud-data-platform


【解决方案1】:

我假设这是编辑过的代码,因为在 CTE 的锚点中,您选择了不存在的第四列 fee_charged,然后在递归中,您没有将 fees paid 和其他东西相加,基本上是您逻辑似乎很奇怪。

所以创建一些随机数据,有两个不同的id 流要递归:

create or replace table data (id number, index number, val text);
insert into data 
  select * from values (1,1,'a'),(2,1,'b')
      ,(1,2,'c'), (2,2,'d')
      ,(1,3,'e'), (2,3,'f')
      v(id, index, val);

现在稍微改变你的 CTE 以将这些字符串连接在一起..

WITH RECURSIVE payments AS
(
  SELECT id
       , index
       , val
    FROM data
   WHERE index = 1

  UNION ALL

  SELECT t.id
       , t.index
       , p.val || t.val as val
    FROM data t
    JOIN payments p
      ON t.id = p.id
     AND t.index = p.index + 1
)
  SELECT * 
    FROM payments 
ORDER BY 1,2;

我们得到:

ID  INDEX   VAL
1   1       a
1   2       ac
1   3       ace
2   1       b
2   2       bd
2   3       bdf

这正是我所期望的。所以这与你的“当我加入其他东西时变得奇怪”的关系是以太,你的 CTE 输出不是你期望的那样。或者你加入其他东西没有像你期望的那样工作,或者那里是雪花的错误。

归根结底,如果 CTE 结果完全符合您的预期,请创建一个表并将其连接到您的另一个表,从而消除某种形式的 CTE 与 JOIN 错误,并调试您的连接不工作的原因。

但是,如果您的 CTE 输出不是您所期望的,那么让我们帮忙调试一下吧。

【讨论】:

  • 非常有帮助,谢谢。一步一步来,我相信CTE结果确实如你所料正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 2015-05-03
  • 2011-03-26
  • 1970-01-01
相关资源
最近更新 更多