如何根据结果得出两行之间的差异

时间:2015-12-21 16:03:09

标签: 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   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 

2 个答案:

答案 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