我有一个包含4列的表格:项目,年份,月份,金额。Amount的某些值是null,当发生这种情况时,我想用以前的非null的Amount值来填充这些值。当只有一个空值时,我可以使用LAG函数轻松地做到这一点,但是当连续有多个空值时,我不确定如何处理它。以下是该表的外观示例,其中添加了要在查询中添加的内容的列:
Item | Year | Month | Amount | New_Amount AAA | 2013 | 01 | 100 | 100 AAA | 2013 | 02 | | 100 AAA | 2013 | 03 | 150 | 150 AAA | 2013 | 04 | 125 | 125 AAA | 2013 | 05 | | 125 AAA | 2013 | 06 | | 125 AAA | 2013 | 07 | | 125 AAA | 2013 | 08 | 175 | 175
我有两个想法,我似乎无法投入工作来实现自己想要的东西。首先,我要使用LAG,但后来我注意到,当连续有多个空值时,它就不能满足要求。接下来,我将使用FIRST_VALUE,但这在这种情况下无济于事,在这种情况下,将有一个null,然后是值,然后是更多的null。有没有一种方法可以使用FIRST_VALUE或其他类似的函数来检索最后一个非空值?
*具有IGNORE *NULLS的last_value 在Oracle 10g中可以正常工作:
select item, year, month, amount, last_value(amount ignore nulls) over(partition by item order by year, month rows between unbounded preceding and 1 preceding) from tab;
rows between unbounded preceding and 1 preceding 设置分析功能的窗口。
rows between unbounded preceding and 1 preceding
在这种情况下,Oracle从开头(UNBOUNDED PRECEDING)到当前行-1(1 PRECEDING),在PARTITION BY(同一项目)中定义的组内搜索LAST_VALUE。
它是Oracle 10g中带有IGNORE NULLS的LEAD / LAG的常见替代品
但是,如果您使用的是Oracle 11g,则可以使用Gordon Linoff的答案中的LAG(有一个小错字,带有“忽略空值”)