【发布时间】:2016-03-13 15:35:35
【问题描述】:
我有一个具体的问题。我有一个包含无效值的表。
我需要将无效值(此处为 0)替换为大于 0 的前一个值。
困难在于,我不适合使用更新或插入(光标和更新会这样做)。我唯一的方法是使用 Select 语句。
当我使用 lag(col1, 1) - 函数和 when case 时,我只得到一列具有正确值。
select col1, col2 realcol2,
(case
when col2 = 0 then
lag(col2,1,1) over (partition by col1 order by col1 )
else
col2
end ) col2,
col3 realcol3,
(case
when col3 = 0 then
lag(col3,1,1) over (partition by col1 order by col1 )
else
col3
end ) col3
from test_table
TEST_TABLE的内容:
---------------------------
Col1 | Col2 | Col3 | Col4
---------------------------
A | 0 | 1 | 5
B | 0 | 4 | 0
C | 2 | 0 | 0
D | 0 | 0 | 0
E | 3 | 5 | 0
F | 0 | 3 | 0
G | 0 | 3 | 1
A | 0 | 1 | 5
E | 3 | 5 | 0
预期的查询结果:
---------------------------
Col1 | Col2 | Col3 | Col4
---------------------------
A | 0 | 1 | 5
B | 0 | 4 | 5
C | 2 | 4 | 5
D | 2 | 4 | 5
E | 3 | 5 | 5
F | 3 | 3 | 5
G | 3 | 3 | 1
A | 3 | 1 | 5
E | 3 | 5 | 5
【问题讨论】:
-
为什么不适合使用游标?这将是有效和高效的。
-
数据中的顺序是如何定义的? IE。为什么
Col1后面有A和E值?
标签: sql oracle window-functions