Sql 如何根据结果获得两行之间的差异
我有一张像下面这样的桌子Sql 如何根据结果获得两行之间的差异,sql,sql-server,Sql,Sql Server,我有一张像下面这样的桌子 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
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
id values difference
2 6 -3
4 3
id values difference
2 6 1
5 7
id values difference
5 7 -1
6 6
id values difference
5 7 1
7 8
id values difference
7 8 -1
8 9
在上述情况下,差异您最好在捕获结果集的编程环境中执行此操作。 如您所见,否则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;
试试看
在客户端执行此操作。这些规则很难看,将导致一个令人难以置信的难看的查询。
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
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