在SQL中计算增量(当前行与上一行的差)

我有一个像这样的表:例如,trans是表的名称

Id | Trans_Date          | Account_Id | Amount | Delta

------------------------------------------------------

1 | 2011-02-20 00:00:00 | 2 | 1200 | NULL

------------------------------------------------------

2 | 2011-03-21 00:00:00 | 2 | 2000 | NULL

------------------------------------------------------

3 | 2011-04-22 00:00:00 | 2 | 4500 | NULL

------------------------------------------------------

4 | 2011-02-20 00:00:00 | 4 | 1000 | NULL

------------------------------------------------------

5 | 2011-03-21 00:00:00 | 4 | 2400 | NULL

------------------------------------------------------

6 | 2011-04-22 00:00:00 | 4 | 3000 | NULL

------------------------------------------------------

而且我必须更新Delta列。假设每月有一笔交易,则该值是同一帐户的当前行与同一帐户的先前行之差。这是一个可以生成增量值的虚拟sql

select tt1.id, tt1.amount , tt1.AccountId,(tt1.amount-tt2.amount) as delta 

from trans tt1 left outer JOIN trans tt2

on tt1.accountid = tt2.accountid

where month(tt1.date1)-month(tt2.date1)=1 ;

该查询的结果是

id | amount | AccountId  | delta  |

-------------------------------------

2 | 2000 | 2 | 800 |

-------------------------------------

3 | 4500 | 2 | 2500 |

-------------------------------------

5 | 2400 | 4 | 1400 |

-------------------------------------

6 | 3000 | 4 | 600 |

-------------------------------------

但是没有任何前一行的行的增量应该是其数量,例如

1  | 1200   |     2      | 1200   | 

-----------------------------------------

4 | 1000 | 4 | 1000 |

-----------------------------------------

这些都是顺便说了。

请帮助我解决此查询。

回答:

这是您对原始查询进行的相应修改:

select

tt1.id,

tt1.amount,

tt1.AccountId,

(tt1.amount-ifnull(tt2.amount, 0)) as delta

from trans tt1

left outer JOIN trans tt2 on tt1.accountid = tt2.accountid

and month(tt1.date1)-month(tt2.date1)=1;

月比较从移动whereon,这使得一个差left join,并且tt2.amount被替换为ifnull(tt2.amount,

0)


UPDATE 脚本 的版本:

update tt1

set delta = (tt1.amount-ifnull(tt2.amount, 0))

from trans tt1

left outer JOIN trans tt2 on tt1.accountid = tt2.accountid

and month(tt1.date1)-month(tt2.date1)=1;


上述更新的正确MySQL语法实际上应为:

update trans tt1 

left outer JOIN trans tt2

on tt1.accountid = tt2.accountid

and month(tt1.date1)-month(tt2.date1)=1

set tt1.delta = (tt1.amount-ifnull(tt2.amount, 0));

(感谢 。)

以上是 在SQL中计算增量(当前行与上一行的差) 的全部内容, 来源链接: utcz.com/qa/431135.html

回到顶部