考虑以下情形:用户有一个或多个(银行)帐户。账目余额的历史变化在表格中进行追踪。我想在他的所有帐户中及时显示用户资金的历史记录。这些表的定义:加入表格的总和
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
你可以给样品期望的输出? – Omesh 2012-08-06 09:23:44
@Omesh:看看最后的代码清单。 – 2012-08-06 09:36:29
我一直在搞乱SQL小提琴,我不得不说我甚至不确定它在SQL中是否可能(尽管我远不是专家)。我认为如果你想在SQL中这样做,除非有一个我不知道的特殊技巧,否则你需要每天都有一个账户值。 – ApplePie 2012-08-06 11:25:13