mysql – 计算与事务一起存储的运行余额

我需要从遗留系统中提供余额和交易数据的只读副本,该副本仅用于查看/打印语句.

Balance
| id | member_id | product_id | balance |
|  1 |    100001 |         33 |  975.00 |
|  1 |    100002 |         15 |   10.43 |
|  1 |    100001 |         15 |    0.00 |

Transactions
| id | member_id | product_id |       date |    value | interest |
|  1 |    100001 |         33 | 2014-09-01 |  -100.00 |     0.00 |
|  2 |    100001 |         33 | 2014-08-20 |   600.00 |     0.00 |
|  1 |    100002 |         15 | 2014-06-01 |   -50.00 |     0.00 |
|  2 |    100001 |         15 | 2014-08-20 |  -600.00 |     0.00 |

此数据是只读的,并且由于遗留系统的外部问题,来自表的数据将被清空,并且每次更新数据时都会重新插入所有内容.不理想,遗留系统应在18个月内更换.

我导入的交易数据没有运行余额列.我需要这个,并提出了两个选择:

>不要为每笔交易存储计算余额,而是即时计算.这使得对帐户报表的分页变得很痛苦,因为无论过去我们必须从最新的余额开始并回溯所有交易历史.我知道没有快速的方法来做这个递归查询.
>导入事务时计算运行余额,并将其存储在每一行中.

第二个是我的首选选项(在提取“2009年3月的声明”时很容易).我试图设计一种更新运行平衡的有效方法:我最好的是代码选择特定用户帐户的所有交易,然后循环更新数字.这不符合要求.

你会怎么处理这个?我必须研究MySQL,但我也有兴趣看到比它支持的更优雅的解决方案.

解决方法:

根据评论尝试答案

最简单,最快捷的方法是采用基于集合的方法.像这样:

1)将NOW()读入变量@N

2)将新数据加载到事务中

3)像这样更新平衡:

UPDATE Balance B
INNER JOIN (
  SELECT SUM(value) as value, member_id, product_id 
  FROM Transactions 
  WHERE date >= @N) AS T
ON B.member_id = T.member_id
AND B.product_id = T.product_id
SET B.balance = B.balance + T.value

4)利润

上一篇:使用numpy.median与其他函数聚合pandas groupby对象的结果不一致


下一篇:mysql – 用户和产品的活动源中的活动组