【问题标题】:Getting error ORA-00918 when using match_recognize使用 match_recognize 时出现错误 ORA-00918
【发布时间】:2017-01-14 19:31:21
【问题描述】:

我正在尝试学习 Oracle 12c 引入的模式匹配。但是得到 ORA-00918: column ambiguously defined 从下面的代码。不知道哪里漏掉了

    SELECT CUSTOMER_ID,ORDER_TOTAL,ORDER_TIMESTAMP FROM DEMO_ORDERS MATCH_RECOGNIZE(
  PARTITION BY CUSTOMER_ID
  ORDER BY CUSTOMER_ID,ORDER_TIMESTAMP

  MEASURES
   A.CUSTOMER_ID AS CUSTOMER,
    A.ORDER_TOTAL AS TOTAL_AMT,
    A.ORDER_TIMESTAMP AS WHEN_HPA
   ALL ROWS PER MATCH
  PATTERN( A B* )
  DEFINE
    B AS (B.ORDER_TOTAL < PREV(B.ORDER_TOTAL))


    )

【问题讨论】:

  • 这段代码还有一些其他问题(除了 Alex 已经指出的问题)。在 MEASURES 中,您仅包含 A.CUSTOMER_ID 等,但您返回 ALL ROWS PER MATCH。如果要为每一行返回各自的值,不要测量 A.CUSTOMER_ID,测量 CUSTOMER_ID。然后,在 SELECT 中使用来自 MEASURES 的列别名。 (您使用了基表中的原始列名,这也很好,因为在 MEASURES 中您没有定义任何新表达式,您只是重命名了现有列)。如果您只想返回现有列,则根本不需要包含 MEASURES!

标签: sql oracle oracle12c


【解决方案1】:

问题在于您的order by 子句;似乎同时看到了原始表列customer_id和匹配分区值。

但是,您按customer_id 进行分区,因此按此排序没有任何意义。排序适用于分区内(如在分析函数中)。所以你可以删除它:

SELECT CUSTOMER_ID,ORDER_TOTAL,ORDER_TIMESTAMP FROM DEMO_ORDERS MATCH_RECOGNIZE(
  PARTITION BY CUSTOMER_ID
  ORDER BY ORDER_TIMESTAMP
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多