小编典典

用最后一个非空值填充空值-Oracle SQL

sql

我有一个包含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或其他类似的函数来检索最后一个非空值?


阅读 269

收藏
2021-05-05

共1个答案

小编典典

*具有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 设置分析功能的窗口。

在这种情况下,Oracle从开头(UNBOUNDED PRECEDING)到当前行-1(1 PRECEDING),在PARTITION
BY(同一项目)中定义的组内搜索LAST_VALUE。

它是Oracle 10g中带有IGNORE NULLS的LEAD / LAG的常见替代品

但是,如果您使用的是Oracle 11g,则可以使用Gordon Linoff的答案中的LAG(有一个小错字,带有“忽略空值”)

2021-05-05