我有一张类似下面的桌子
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,所以我们需要考虑id2,3值来找出差异
id values difference
2 6 -2
3 4在上面的情况下,差异<=0,所以我们需要考虑id2,4值来找出差异
id values difference
2 6 -3
4 3在上面的情况下,差异<=0,所以我们需要考虑id2,5值来找出差异
id values difference
2 6 1
5 7在上面的情况下,差异>0,所以我们需要考虑id5,6值来找出差异
id values difference
5 7 -1
6 6 在上面的情况下,差异<=0,所以我们需要考虑id5,7值来找出差异
id values difference
5 7 1
7 8在上面的情况下,差异>0,所以我们需要考虑id7,8值来找出差异
id values difference
7 8 -1
8 9 发布于 2015-12-22 00:13:59
您最好在捕获结果集的编程环境中执行此操作。正如您所看到的,否则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发布于 2015-12-22 00:29:45
试一下,
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 1https://stackoverflow.com/questions/34399773
复制相似问题