2014-03-02 91 views
0

匹配的記錄我在ORACLE一個簡單的表看起來像下面獲取差異在ORACLE

name   size date 
------------------------- 
feature1  207  01/01/2013 
feature2  203  01/01/2013 
feature3  205  01/01/2013 

feature1  209  01/01/2014 
feature2  139  01/01/2014 
feature3  300  01/01/2014 

我需要能夠確定的差別(+或 - )爲每個2013年和2014年之間個人記錄。

,我想應該是這樣的

name   diff 
------------------- 
feature1  2 
feature2  -64 
feature3  95 

是否有一個簡單的方法來實現這一結果,而無需創建一個光標,遍歷每個記錄單獨的輸出嗎?

回答

2

另一種方式,假設你只希望那些特定年,有兩個年度爲每名數據:

select name_col, 
    min(case when extract(year from date_col) = 2014 then size_col end) 
    - min(case when extract(year from date_col) = 2013 then size_col end) 
from <your table> 
group by name_col 
order by name_col; 

如果兩年沒有數據,則可以將每個min包裝在nvl(min(...), 0)中。

SQL Fiddle。戈登的是一個更一般的方法,雖然...

+0

這也是一個非常好的方法。 –

+0

感謝您的及時迴應!我嘗試了Gordon的建議,但它似乎沒有爲我的數據輸出正確的結果。我試着用你的SQL小提琴,它出來就像我需要它。再次感謝你。 – jamesamuir

4

您可以使用分析功能lag()獲得前值:

select name, (size - prevsize) as diff 
from (select t.*, lag(size) over (partition by name order by date) as prevsize 
     from t 
    ) t 
where prevsize is not null;