2015-12-21 70 views
0

我有一個表像下面如何根據結果

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 
+7

做客戶端。規則是醜陋的,並會造成難以置信的醜陋的查詢。 –

回答

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