首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySql移动差异?

MySql移动差异?
EN

Stack Overflow用户
提问于 2009-02-16 17:47:47
回答 1查看 229关注 0票数 1

假设我有下面的代码

代码语言:javascript
复制
create temporary table somedata (a integer);
insert into somedata (a) values (11), (25), (62); --#these values are always increasing
select * from somedata;

给出这个

代码语言:javascript
复制
+--+
|a |
+--+
|11|
|25|
|62|
+--+

如何计算一列值'b‘,其中每个值都是当前行中的'a’值与前一行中的'a‘值之间的差值?

代码语言:javascript
复制
+--+--+
|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的网站或其他任何地方找到如何做到这一点,我觉得有点愚蠢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-02-16 17:55:21

如果您有一个别名列来为每一行提供自己的id,这会更容易-然后您可以在(alias2.id=alias1.id+1)上针对表本身联接表,并计算与别名2.a- auto_increment 1.a的差异。

事实上,我认为唯一的方法是使用子查询来获得小于当前行值的最大值,这将是非常低效的。

因此,如果可以,修改您的模式!

代码语言:javascript
复制
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 |
+------+------+

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

编辑:有关此概念的更完整的演练,请参阅本文:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/553950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档