2009-02-16 82 views
1

假設我有這樣的代碼MySql移動差異?

create temporary table somedata (a integer); 
insert into somedata (a) values (11), (25), (62); --#these values are always increasing 
select * from somedata; 

給這個

+--+ 
|a | 
+--+ 
|11| 
|25| 
|62| 
+--+ 

如何計算的值「B」,其中一個是「A」在當前的價值之間的差額列行和前一行中'a'的值?

+--+--+ 
|a |b | 
+--+--+ 
|11| 0| # ie 11-11 since theres no preceding row 
|25|14| # ie 25-11 
|62|37| # ie 62-25 etc 
+--+--+ 

這是OpenOffice的那麼明顯或excel,我覺得有點傻沒有還沒有找到如何做到這一點在MySQL的網站上,也沒有任何其他地方。

+0

這是電子表格中的明顯,因爲做這些事是其數據模型的重要組成部分。關係數據模型(谷歌://關係代數)的前提是每個表都是無序的一組獨立行 - 「下一個」或「前一個」行的概念不存在。 – 2009-02-16 18:19:40

回答

2

如果你有一個auto_increment列來給每一行指定自己的id,那麼你就可以更容易地在(alias2.id = alias1.id + 1)上加入表格並且計算出alias2.a- alias1.a

事實上,我認爲唯一的方法是用子查詢來獲取最大值小於當前行值,這將是非常低效的。

所以,如果你可以,修改你的模式!

create table somedata (
    id int auto_increment not null, 
    a integer, 
    primary key(id) 
); 
insert into somedata (a) values (11), (25), (62); 

select a2.a,ifnull(a2.a-a1.a, 0) as diff 
from somedata as a1 
right join somedata as a2 on (a2.id=a1.id+1); 

+------+------+ 
| a | diff | 
+------+------+ 
| 11 | 0 | 
| 25 | 14 | 
| 62 | 37 | 
+------+------+ 

如果您不想要第一個零結果,請使用內部聯接而不是右側聯接。

編輯:看到這篇文章,這個想法有更全面的演練:Calculating differences between successive rows

+0

太棒了!感謝Paul的提示。該鏈接看起來非常有幫助。 – kalyanji 2009-02-16 18:02:43