假设我有这样的代码

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

使用内加入而不是一个正确的参加,如果你不想,第一零结果。

编辑:看看这篇文章为一个更充分的演练这样的想法: 计算之间差异的连续行

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top