sql – 在LAST_VALUE上不清楚 – 在前面

我有一张看起来像这样的桌子,

Date                   Value
01/01/2010 03:59:00     324.44
01/02/2010 09:31:00     NULL
01/02/2010 09:32:00     NULL
.
.
.
01/02/2010 11:42:00     NULL

我希望第一个有效值出现在以下所有行中.这就是我做的,

select date, 
   nvl(value, LAST_VALUE(value IGNORE NULLS) over (order by value RANGE BETWEEN 1 PRECEDING AND CURRENT ROW)) value
from
    table

这显示没有任何区别,但如果我说3预先和当前行之间的范围,它会将数据复制到所有行.我不清楚为什么会这样.任何人都可以解释我是否误解了如何使用前面的?

最佳答案 分析函数仍然适用于数据集.它们不会一次处理一行,您需要PL / SQL或MODEL来执行此操作. PRECEDING指的是最后的X行,但是在应用分析函数之前.

这些问题在SQL中可能会引起混淆,因为您必须构建逻辑来定义集合,而不是尝试将数据从一行传递到另一行.这就是我在previous answer中使用CASE和LAST_VALUE的原因.

编辑:

我添加了一个简单的数据集,因此我们都可以运行完全相同的查询. VALUE1似乎对我有用,我错过了什么吗? VALUE2的部分问题在于分析ORDER BY使用VALUE而不是日期.

select id, the_date, value
    ,last_value(value ignore nulls) over
        (partition by id order by the_date) value1
    ,nvl(value, LAST_VALUE(value IGNORE NULLS) over
        (order by value RANGE BETWEEN 1 PRECEDING AND CURRENT ROW)) value2
from
(
    select 1 id, date '2011-01-01' the_date, 100  value from dual union all
    select 1 id, date '2011-01-02' the_date, null value from dual union all
    select 1 id, date '2011-01-03' the_date, null value from dual union all
    select 1 id, date '2011-01-04' the_date, null value from dual union all
    select 1 id, date '2011-01-05' the_date, 200  value from dual
)
order by the_date;

结果:

ID  THE_DATE    VALUE   VALUE1  VALUE2
1   1/1/2011    100     100     100
1   1/2/2011            100     
1   1/3/2011            100     
1   1/4/2011            100     
1   1/5/2011    200     200     200
点赞