如何在 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 函数,直到到达非零或最后一行?的主要内容,如果未能解决你的问题,请参考以下文章