题
假设我有这样的代码
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的网站,也没有任何其他地方。
解决方案
它会更容易,如果你有一个auto_increment column给每个行其自己的身份证-那么你可以加入该表格对本身(alias2.id=alias1.id+1),并计算出的差异从alias2.a-alias1.一个
正因为如此,我认为唯一的办法是与一个查询来获得最大的价值低于目前的行值,这将是非常低效率的。
所以如果可以的话,修改你的架构!
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 |
+------+------+
使用内加入而不是一个正确的参加,如果你不想,第一零结果。
编辑:看看这篇文章为一个更充分的演练这样的想法: 计算之间差异的连续行
不隶属于 StackOverflow