1

假设我有这个代码

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 的网站或其他任何地方都没有找到如何做到这一点有点傻。

4

1 回答 1

2

如果您有一个 auto_increment 列来为每一行提供自己的 id 会更容易 - 然后您可以在 (alias2.id=alias1.id+1) 上加入表并计算与 alias2.a-alias1.a 的差异

事实上,我认为唯一的方法是使用子查询来获取小于当前行值的最大值 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 |
+------+------+

如果您不想要第一个零结果,请使用内连接而不是右连接。

编辑:有关此想法的更完整演练,请参阅本文:计算连续行之间的差异

于 2009-02-16T17:55:21.453 回答