分析函數仍然適用於數據集。他們不會一次處理一行,您需要使用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
我不期望它每次工作一行,這就是爲什麼我試圖讓它選擇自身之上的第一個非空值。但是我發現那沒有發生。 – Aks
我試過你的答案了。同樣的問題發生 – Aks
好的。我使用的'nvl(value,last_value(值忽略空值)超過 (由id按日期排列的分區)value1'。This works。Thanks – Aks