在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;
月比较从移动where到on,这使得一个差left join,并且tt2.amount被替换为ifnull(tt2.amount,
0)。
UPDATE 脚本 的版本:
update tt1set 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








