按资金变化顺序计算每日余额,求解法?

有一张客户资金变化表(change),它记录每天(bizdate)每笔交易导致的客户(cust)资金变化(change)及变化后的资金余额(balance)。

|------+---------+--------+---------|
| cust | bizdate | change | balance |
|------+---------+--------+---------|
| A    | Sep 4   |     25 |     100 |
| B    | Sep 5   |    100 |      90 |
| B    | Sep 5   |    -20 |     -10 |
| B    | Sep 4   |    -40 |      10 |
| A    | Sep 5   |     10 |      80 |
| A    | Sep 4   |    -30 |      70 |
|------+---------+--------+---------|

同一位客户每天可以有多行交易记录,而且行的顺序是不确定的。上表实际的发生顺序应该是:

|------+---------+--------+---------|
| cust | bizdate | change | balance |
|------+---------+--------+---------|
| A    | Sep 4   |     25 |     100 |
| A    | Sep 4   |    -30 |      70 |
| A    | Sep 5   |     10 |      80 |
| B    | Sep 4   |    -40 |      10 |
| B    | Sep 5   |    -20 |     -10 |
| B    | Sep 5   |    100 |      90 |
|------+---------+--------+---------|

也就是说changebalance存在一个因果关系。现在想要统计客户每天的资金余额(daily_balance):

|------+---------+---------|
| cust | bizdate | balance |
|------+---------+---------|
| A    | Sep 4   |      70 |
| A    | Sep 5   |      80 |
| B    | Sep 4   |      10 |
| B    | Sep 5   |      90 |
|------+---------+---------|

怎样写SQL才能达到目的?

注意有可能出现无法判断先后顺序的情况:

|------+---------+--------+---------|
| cust | bizdate | change | balance |
|------+---------+--------+---------|
| A    | Sep 6   |     10 |     100 |
| A    | Sep 6   |    -10 |      90 |
|------+---------+--------+---------|

我也没想好怎么处理。实际中还没有遇到。

阅读 5k
3 个回答

这个从逻辑是无解
建议在数据库上面增加一个插入时间的字段,默认成当前时间就行,这样就能判断出客户当天最后一笔的交易记录,余额自然就清楚了。

如果不想改原表结构,可以考虑触发器的机制,每次插入新纪录时更新客户在交易日的余额表。

这业务逻辑,只能根据资金变化逻辑去判断先后顺序,并且仍然可能不准确,即使做出精确判断也是效率极其低下,本来设置一个精确时间字段或者一个序列号就可以解决的问题,完全是舍本逐末!差评!

这数据结构设计的很让人无语,没有时间记录行为,处理起来很痛苦

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题