如何在 oracle pl sql 中使用 LAG 函数,直到到达非零或最后一行?

Posted

技术标签:

【中文标题】如何在 oracle pl sql 中使用 LAG 函数,直到到达非零或最后一行?【英文标题】:How to use LAG function in oracle pl sql until non zero or last row is reached? 【发布时间】:2016-02-20 20:06:13 【问题描述】:

我想以这样一种方式为表列编写 LAG 函数,如果列值为零,它应该滞后该 id 的值,如果前一行再次为零,它应该再次 LAG,直到它到达非零行或最后一行行请帮助。在此先感谢

【问题讨论】:

请显示示例、数据预期输出以及您尝试过的内容。 【参考方案1】:

两次调用同一个表不是更简单吗(例如,称它们为 A 和 B)。

在B中,过滤掉所有值为零的行,然后做一个简单的LAG(field,1)。

然后只需加入这两个表。

瞧!

【讨论】:

【参考方案2】:

LAG() IGNORE NULLS ...CASE 语句结合使用:

LAG(
  CASE COLUMN_NAME
    WHEN 0
    THEN NULL
    ELSE COLUMN_NAME
    END
) IGNORE NULLS OVER ( ORDER BY OTHER_COLUMN )

例如

WITH DATA ( id, value ) AS (
  SELECT 1, 1 FROM DUAL UNION ALL
  SELECT 2, 0 FROM DUAL UNION ALL
  SELECT 3, 0 FROM DUAL UNION ALL
  SELECT 4, 2 FROM DUAL UNION ALL
  SELECT 5, 0 FROM DUAL
)
SELECT  id,
        value,
        LAG(
          CASE VALUE
               WHEN 0
               THEN NULL
               ELSE VALUE
               END
        ) IGNORE NULLS
          OVER ( ORDER BY id )
          AS prev_non_zero_value
FROM    DATA;

输出

        ID      VALUE PREV_NON_ZERO_VALUE
---------- ---------- -------------------
         1          1                     
         2          0                   1 
         3          0                   1 
         4          2                   1 
         5          0                   2 

【讨论】:

以上是关于如何在 oracle pl sql 中使用 LAG 函数,直到到达非零或最后一行?的主要内容,如果未能解决你的问题,请参考以下文章

SQL-Oracle 使用 LAG() 从自身更新表

如何创建一个 Oracle 全局类型并在 PL/SQL 中使用它?

Oracle PL/SQL:如何在长包中查找未使用的变量?

如何在 Oracle PL/SQL 函数中使用变量

如何使用 PL-SQL 在 Oracle 中获取列数据类型

如何在 Oracle 中调试 PL/SQL 集合的值?