假设我有这段代码
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 :(得分: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