有一张客户资金变化表(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 |
|------+---------+--------+---------|
也就是说change
和balance
存在一个因果关系。现在想要统计客户每天的资金余额(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 |
|------+---------+--------+---------|
我也没想好怎么处理。实际中还没有遇到。
这个从逻辑是无解
建议在数据库上面增加一个插入时间的字段,默认成当前时间就行,这样就能判断出客户当天最后一笔的交易记录,余额自然就清楚了。
如果不想改原表结构,可以考虑触发器的机制,每次插入新纪录时更新客户在交易日的余额表。