mysql – 根据前一行和实际行值计算行值

大家好,感谢您的帮助.
我有以下情况:一个名为语句的表,包含字段id(int),stmnt_date(date),debit(double),credit(double)和balance(double)

我想按照这些规则计算余额:

第一行余额(按时间顺序排列)=借记 – 贷记和其余行

当前行余额=按时间顺序排列前一行平衡当前行借记 – 当前行信用

正如您在上面的图片中看到的那样,行不按日期排列,这就是为什么我使用时间顺序两次来强调stmnt_date值的重要性.

非常感谢您的帮助.

最佳答案
假设stmnt_date具有UNIQUE约束,对于窗口/分析函数,这将非常简单:

SELECT 
    s.stmnt_date, s.debit, s.credit,
    SUM(s.debit - s.credit) OVER (ORDER BY s.stmnt_date
                                  ROWS BETWEEN UNBOUNDED PRECEDING
                                           AND CURRENT ROW)
        AS balance
FROM
    statements AS s
ORDER BY
    stmnt_date ;

不幸的是,MySQL还没有实现分析功能.您可以使用严格的SQL,通过自联接表来解决问题(尽管工作率为100%,但效率相当低),或者使用特定的MySQL功能,变量(这将非常有效,但您必须对其进行测试)升级mysql时,要确保结果仍然正确并且不会因某些优化改进而受到损害):

SELECT 
    s.stmnt_date, s.debit, s.credit,
    @b := @b + s.debit - s.credit AS balance
FROM
    (SELECT @b := 0.0) AS dummy 
  CROSS JOIN
    statements AS s
ORDER BY
    stmnt_date ;

根据您的数据,它将导致:

+------------+-------+--------+---------+
| stmnt_date | debit | credit | balance |
+------------+-------+--------+---------+
| 2014-05-15 |  3000 |      0 |    3000 |
| 2014-06-17 | 20000 |      0 |   23000 |
| 2014-07-16 |     0 |   3000 |   20000 |
| 2014-08-14 |     0 |   3000 |   17000 |
| 2015-02-01 |  3000 |      0 |   20000 |
+------------+-------+--------+---------+
5 rows in set (0.00 sec)

转载注明原文:mysql – 根据前一行和实际行值计算行值 - 代码日志