我想进行一些数据报告,但我很少进行 SQL 技巧,不知道我在寻找什么功能。我会称其为“取消分组”。我有一个 SELECT 输出了一系列月度订阅项目的内容:它们何时创建、关闭以及每月支出金额:
+----+---------------------------------+------------+------------+------------+
| id | description | created_on | closed_on | monthly |
+----+---------------------------------+------------+------------+------------+
| 3 | Daily horoscope email | 2012-01-01 | null | 10000.0000 |
| 5 | Pet food delivery | 2012-01-05 | null | 3500.0000 |
| 6 | Dirty magazine subscription | 2012-01-09 | null | 1500.0000 |
| 7 | Stupid nuts posted in a box | 2012-01-01 | 2012-01-04 | 1500.0000 |
.... etc ...
我想要做的是每天计算“运行速率”。因此,每天都会列出当前月度承诺的累计总数。例如,上述数据将映射到:
+------------+----------+
| date | run_rate |
+------------+----------+
| 2012-01-01 | 11500 |
| 2012-01-02 | 11500 |
| 2012-01-03 | 11500 |
| 2012-01-04 | 10000 |
| 2012-01-05 | 13500 |
| 2012-01-06 | 13500 |
| 2012-01-07 | 13500 |
| 2012-01-08 | 13500 |
| 2012-01-09 | 15000 |
我认为可能的方法是创建一个临时表,每天一行,然后编写一个LEFT JOIN / GROUP BY语句引用第一个表来构建输出。但我只能想到如何通过这种方式创建逐日的“差异”,而不是运行总数,我需要将第一个表“取消分组”成两个条目,一个是订阅创建时的正数条目,一个是关闭时的负数条目。
我想坚持使用MySQL,并且如果可能的话,在一个超级语句中完成。如果不可能,我可以在我的查询框架中添加一些存储过程或临时表。或者我真的需要通过Ruby处理数据吗?(我知道确切的方法,但希望我可以将所有逻辑保存在一个地方,而且我正在试图改进我们目前使用ActiveRecord的缓慢计算。)