【问题标题】:Oracle PL/SQL Model Clause for Recursion用于递归的 Oracle PL/SQL 模型子句
【发布时间】:2018-01-31 15:38:53
【问题描述】:

当连续 NULL 值的数量变化时,寻找有关如何根据先前行中的值填充 NULL 值的答案。看起来 PL/SQL MODEL 子句应该可以做到,但我根本无法弄清楚语法。这是一个玩具数据集:

CREATE TABLE SO_EXAMPLE_TMP (
  EXAMPLE_ID VARCHAR2(5)
  , SALES_STAGE VARCHAR(16)
  , RECORD_MONTH DATE
);

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY';

INSERT ALL
INTO SO_EXAMPLE_TMP VALUES ('ABC12', 'PIPELINE', '01-JAN-2017') 
INTO SO_EXAMPLE_TMP VALUES ('ABC12', NULL      , '01-FEB-2017')  
INTO SO_EXAMPLE_TMP VALUES ('ABC12', NULL      , '01-MAR-2017') 
INTO SO_EXAMPLE_TMP VALUES ('ABC12', NULL      , '01-APR-2017')
INTO SO_EXAMPLE_TMP VALUES ('ABC12', 'COMMIT'  , '01-MAY-2017')
INTO SO_EXAMPLE_TMP VALUES ('ABC12', NULL      , '01-JUN-2017')
INTO SO_EXAMPLE_TMP VALUES ('ABC12', 'CLOSED'  , '01-JUL-2017')
INTO SO_EXAMPLE_TMP VALUES ('XYZ98', 'PIPELINE', '01-FEB-2017')   
INTO SO_EXAMPLE_TMP VALUES ('XYZ98', 'COMMIT'  , '01-MAR-2017') 
INTO SO_EXAMPLE_TMP VALUES ('XYZ98', NULL      , '01-APR-2017') 
INTO SO_EXAMPLE_TMP VALUES ('XYZ98', NULL      , '01-MAY-2017')
INTO SO_EXAMPLE_TMP VALUES ('XYZ98', 'CLOSED'  , '01-JUN-2017')  
SELECT 1 FROM DUAL;

我的输出目标是用前一行的值填充 NULL 值,例如SALES_STAGE 列中的第 2-4 行都应将“PIPELINE”显示为值,因为它们当前为 NULL,并且最接近的先前填充值是第 1 行中的“PIPELINE”。同样,第 6 行应该有 SALES_STAGE 的“COMMIT”等。如果有比使用 MODEL 更简单的方法来做到这一点,我也很乐意这样做,只是很难让递归在我想要的地方工作。谢谢。

【问题讨论】:

标签: oracle recursion plsql oracle11g


【解决方案1】:

使用LAST_VALUE 分析函数应该可以解决问题,如下所示:

SELECT example_id, LAST_VALUE(sales_stage IGNORE NULLS) OVER (PARTITION BY example_id ORDER BY record_month), record_month
FROM so_example_tmp

【讨论】:

  • 非常感谢。我肯定把它复杂化了,我不知道存在 IGNORE NULLS 子句,但这是一个简单的修复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 1970-01-01
相关资源
最近更新 更多