在达到非零或最后一行之前,如何在oracle pl sql中使用LAG函数?
我想为表列编写滞后函数,如果列值为零,则该id的滞后值应为零。如果前一行的滞后值再次为零,则该id应再次滞后,直到到达非零行或最后一行。请帮助。提前感谢。两次调用同一个表不是更简单吗(例如,将它们分别称为a和B) 在B中,过滤掉值等于零的所有行,然后做一个简单的延迟(字段1) 然后把这两个表连接起来 瞧 与在达到非零或最后一行之前,如何在oracle pl sql中使用LAG函数?,sql,oracle,oracle11g,window-functions,Sql,Oracle,Oracle11g,Window Functions,我想为表列编写滞后函数,如果列值为零,则该id的滞后值应为零。如果前一行的滞后值再次为零,则该id应再次滞后,直到到达非零行或最后一行。请帮助。提前感谢。两次调用同一个表不是更简单吗(例如,将它们分别称为a和B) 在B中,过滤掉值等于零的所有行,然后做一个简单的延迟(字段1) 然后把这两个表连接起来 瞧 与案例语句结合使用: LAG( CASE COLUMN_NAME WHEN 0 THEN NULL ELSE COLUMN_NAME END ) IGNORE
案例
语句结合使用:
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
输出:
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
请显示示例、数据、预期输出以及您尝试过的内容。