考虑以下场景:用户拥有一个或多个(银行)帐户。账户余额的历史变化在表格中进行跟踪。我想及时显示用户所有账户的资金历史记录。这些是表定义:
CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `accounts` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `balances` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`account_id` int(11) DEFAULT NULL,
`amount` int(11) DEFAULT NULL,
`created_at` date DEFAULT NULL,
PRIMARY KEY (`id`)
);
这是一些示例数据:
INSERT INTO `users` (`id`, `name`)
VALUES
(1,'Bob');
INSERT INTO `accounts` (`id`, `user_id`)
VALUES
(1,1),
(2,1);
INSERT INTO `balances` (`id`, `account_id`, `amount`, `created_at`)
VALUES
(1,1,100, '2012-01-01'),
(2,1,150, '2012-01-02'),
(3,2,1000,'2012-01-04'),
(4,2,1100,'2012-01-08'),
(5,1,175, '2012-01-10');
用户每天只能跨账户进行一次存款/取款,因此这些created_at
值可以被认为是唯一的。
给定样本数据,我想写的查询结果应该是这样的:
|'2012-01-01'|100 |
|'2012-01-02'|150 |
|'2012-01-04'|1150|
|'2012-01-08'|1250|
|'2012-01-10'|1275|
计划如下:
- 从余额表中获取所有唯一日期。
- 对于每个日期,选择每个帐户中的最新余额,以便余额的日期不超过步骤 1 中的日期。
- 将步骤 2 中找到的金额相加,忽略 NULL 值。NULL 值意味着该帐户的第一个记录余额用于以后的日期。
我无法为步骤 2 制定条件。