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