sql - 在sql中计算增量(当前行和上一行的差异)

标签 sql mysql

我有一个像这样的表: 例如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 jointt2.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));

(感谢@pinkb。)

关于sql - 在sql中计算增量(当前行和上一行的差异),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5078987/

相关文章:

sql - 如何从每组的前一行获取列值?

java - @Where 子句在 hibernate 连接查询中不起作用

sql - 在 elasticsearch 中从 postgresql 对分区进行排名

php - 您关注的人的 mysql Activity 源(点赞、评论等)

mysql - MySql 中的分隔符错误

MySQL - 选择在过去 y 天内至少下了 x 个订单并且在过去 z 天内没有订购的客户

sql - SAS SQL 中带有条件语句的子查询

c++ - 使用 mysql 连接器将 mysql 数据库中的数据存储到 C++ 变量中

mysql - CakePHP:表连接

mysql - 有没有办法在一个查询中包含多个 IN 子句?