我有一张如下表
ID Value
1 5
2 6
3 4
4 3
5 7
6 6
7 8
8 9
输出像行之间的差异
ID Value difference
1 5 null
2 6 1
3 4 -2
4 3 -3
5 7 1
6 6 -1
7 8 1
8 9 -1
以上输出的情景:
1) id values difference
1 5 1
2 6
在上面的情况差异> 0,所以我们需要考虑id 2,3值来找到差异
id values difference
2 6 -2
3 4
在上面的情况差异< = 0所以我们需要考虑id 2,4值来找出差异
id values difference
2 6 -3
4 3
在上面的情况差异< = 0所以我们需要考虑id 2,5值来找到差异
id values difference
2 6 1
5 7
在上述情况差异> 0,所以我们需要考虑id 5,6值来找到差异
id values difference
5 7 -1
6 6
在上面的情况差异< = 0所以我们需要考虑id 5,7值来找到差异
id values difference
5 7 1
7 8
在上面的情况差异> 0,所以我们需要考虑id 7,8值来找到差异
id values difference
7 8 -1
8 9
答案 0 :(得分:0)
您最好在捕获结果集的编程环境中执行此操作。 正如你所看到的那样,SQL语句变得有点难看,当你有一个大表时,性能也会受到影响:
select a.id, a.value, (a.value - b.value) as diff
from test as a
left join test as b
on b.id = (select max(id) from test where id < a.id)
order by a.id;
这是fiddle。
输出:
id value diff
1 5 (null)
2 6 1
3 4 -2
4 3 -1
5 7 4
6 6 -1
7 8 2
8 9 1
答案 1 :(得分:0)
试,
declare @t table ( ID int, Value int)
insert into @t(id,value) values
(1 , 5),
(2 , 6),
(3 , 4),
(4 , 3),
(5 , 7),
(6 , 6),
(7 , 8),
(8 , 9)
select id,value,value-n as diff from @t t
cross apply (select max(value) n from @t where id<t.id) t1
结果
id value diff
1 5 NULL
2 6 1
3 4 -2
4 3 -3
5 7 1
6 6 -1
7 8 1
8 9 1