我在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
是否有一种简单的方法可以实现此结果,而无需创建游标并单独遍历每条记录?
答案 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。虽然戈登是一种更为通用的方法......