MySql移动差异?

时间:2009-02-16 17:47:47

标签: mysql math calculated-columns

假设我有这段代码

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的网站上或其他任何地方执行此操作。

1 个答案:

答案 0 :(得分:2)

如果你有一个auto_increment列给每一行都有自己的id会更容易 - 那么你可以将表连接到自己(alias2.id = alias1.id + 1)并从alias2.a-alias1计算diff。 .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