2014-03-02 48 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;