2011-02-01 69 views
2

如何從一個SELECT語句如何獲取前行值

如果我們有一個名爲cardevent表,具有行[ID(INT),價值(金錢),而且我們有一個結果行的值某些行的話,例如

ID --Value 

1------70 
1------90 
2------100 
2------150 
2------300 
3------150 
3------200 
3-----250 
3-----280 

等等...

如何使一個查詢得到的每一行ID,值與前行值,其中數據顯示爲遵循

ID --- Value ---Prev_Value 

1 ----- 70 ---------- 0 
1 ----- 90 ---------- 70 
2 ----- 100 -------- 90 
2 ------150 -------- 100 
2 ------300 -------- 150 
3 ----- 150 -------- 300 
3 ----- 200 -------- 150 
3 ---- 250 -------- 200 
3 ---- 280 -------- 250 

等。

那麼,任何人都可以幫助我得到解決這個問題的最佳解決方案嗎?

需要查詢幫助

+1

您的兩行`[1,70]`和`[1,90]`可以以任意順序存儲在數據庫中。如何挑選哪一個在另一個之前?它可能會根據內部數據庫數據結構重新平衡而不時變化。 – sarnold 2011-02-01 07:40:38

+1

可能的重複[有一種方法來訪問SELECT語句中的「上一行」值?](http://stackoverflow.com/questions/710212/there-is-a-way-to-access-the-前一行的值在選擇語句) – 2011-02-01 07:40:55

+0

[有沒有辦法在SELECT語句中訪問「上一行」值?](https://stackoverflow.com/questions/710212/是有一種方式來訪問前一行的值在選擇語句) – MatSnow 2017-11-15 13:58:16

回答

4

你將不得不加入表本身,我不知道這是否是100%合法的SQL,但我沒有SQL-Server來試試這個的那一刻,但試試這個:

select (ID, Value) from table as table1 join 
inner join table as table2 
on table1.ID = (table2.ID -1) 
1

您可以使用LAG()和LEAD()函數獲取上一個值和下一個值。

SELECT t.Value OVER (ORDER BY t.ID) PREVIOUS_VALUE, 
t.value VALUE, 
LEAD(t.value) OVER (ORDER BY t.ID) NEXT_VALUE 
FROM TABLE T 

GO 
0
select t1.value - t2.value from table t1, table t2 
where t1.primaryKey = t2.primaryKey - 1 

試試這個。

1

SELECT t.*, LAG(t.Value) OVER (ORDER BY t.ID) FROM table AS t

這應該工作。 Lag函數獲取特定列的前一行值。我認爲這是你想要的。