2011-11-28 89 views
4

我有一個表,看起來像這樣,不清楚在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 

這表明沒有任何區別可言,但如果我說RANGE BETWEEN 3 PRECEDING AND CURRENT ROW這將數據複製到所有行。我不清楚爲什麼會發生這種情況。任何人都可以解釋,如果我誤解如何使用之前?

回答

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 
+0

我不期望它每次工作一行,這就是爲什麼我試圖讓它選擇自身之上的第一個非空值。但是我發現那沒有發生。 – Aks

+0

我試過你的答案了。同樣的問題發生 – Aks

+0

好的。我使用的'nvl(value,last_value(值忽略空值)超過 (由id按日期排列的分區)value1'。This works。Thanks – Aks

0

有可能在時間複製一個行,因爲我做的是用java邏輯和SQL查詢

  Statement sta; 
      ResultSet rs,rslast; 

      try{ 

//創建連接代碼和「 con「是Connection類的一個對象,所以不要混淆這個。

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。

現在我希望你製作出只插入最後一條記錄的邏輯。