2015-05-28 84 views
2

我有一个表orders在SQL中减去前一行减去当前行

如何减去前一行减去当前行的列Incoming

enter image description here

别人的帮助。

+0

什么定义了上一行?约会?以及来自给定样本数据的预期结果是什么?这是MySQL还是Oracle? –

+2

尝试使用铅Oracle函数:) –

+0

为什么MYSQL标签? –

回答

9

在我的SQL

select a.Incoming, 
coalesce(a.Incoming - 
    (select b.Incoming from orders b where b.id = a.id + 1), a.Incoming) as differance 
from orders a 
5

使用LAG功能的Oracle。

尝试此查询

SELECT DATE_IN,Incoming, 
    LAG(Incoming, 1, 0) OVER (ORDER BY Incoming) AS inc_previous, 
    LAG(Incoming, 1, 0) OVER (ORDER BY Incoming) - Incoming AS Diff 
FROM orders 

SQL Fiddle Link

+0

排序依据输入不正确。减去_previous_行减去当前行,不要求与下一行的差异。所以我认为,正确的方向,错误的答案? :-) –

2
create table orders (date_in date, incoming_vol number); 

insert into orders values (to_date('27.05.2015', 'DD.MM.YYYY'), 83); 
insert into orders values (to_date('26.05.2015', 'DD.MM.YYYY'), 107); 
insert into orders values (to_date('25.05.2015', 'DD.MM.YYYY'), 20); 
insert into orders values (to_date('24.05.2015', 'DD.MM.YYYY'), 7); 
insert into orders values (to_date('22.05.2015', 'DD.MM.YYYY'), 71); 

的LAG功能用于访问数据从先前行

SELECT DATE_IN, 
     incoming_vol as incoming, 
     LAG(incoming_vol, 1, incoming_vol) OVER (ORDER BY date_in) - incoming_vol AS incoming_diff 
FROM orders 
order by 1 desc 

而不分析函数的另一个解决方案:

select o.date_in, o.incoming_vol, p.incoming_vol-o.incoming_vol 
from orders p, orders o 
where p.date_in = (select nvl(max(oo.date_in), o.date_in) 
        from orders oo where oo.date_in < o.date_in) 
;