不清楚LAST_VALUE - Preceding

时间:2011-11-28 05:08:01

标签: sql oracle

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

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

这显示没有任何区别,但如果我说RANGE BETWEEN 3 PRECEDING AND CURRENT ROW,它会将数据复制到所有行。我不清楚为什么会这样。任何人都可以解释我是否误解了如何使用前面的?

2 个答案:

答案 0 :(得分:2)

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

这些问题在SQL中可能会引起混淆,因为您必须构建逻辑来定义集合,而不是尝试将数据从一行传递到另一行。这就是我在previous answer中使用CASELAST_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

答案 1 :(得分:0)

可以复制一行,因为我已经使用java Logic和Sql查询

完成了这一行
            Statement sta;
            ResultSet rs,rslast;

            try{

//连接创建代码和“con”是Connection Class的对象,所以不要混淆。

    sta = con.createStatement();

    rs=sta.executeQuery("SELECT * FROM TABLE NAME");
    rslast=sta.executeQuery("SELECT * FROM TABLENAME WHERE ID = (SELECT MAX(ID) FROM TABLENAME)");
    rslast.next();
    String digit  =rslast.getString("ID");

    System.out.print("ID"+rslast.getString("ID")); // it gives ID of the Last Record.

使用此方法,您也可以按降序使用ORDER by Date。

现在我希望你制作只插入最后记录的逻辑。