获得ORACLE中匹配记录的差异

时间:2014-03-02 16:14:53

标签: sql oracle difference

我在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年之间的差异(+或 - )。

我想要的输出I看起来像这样

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

是否有一种简单的方法可以实现此结果,而无需创建游标并单独遍历每条记录?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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。虽然戈登是一种更为通用的方法......