我有一个包含以下数据的表:
客户| id |日期| mrr |更改
mrrïu change是客户订阅中超过上一笔交易的增量收入变化。因此,如果客户以20美元/月的价格购买计划,然后升级到30美元/月的计划,则此交易的mrr\ U更改将为30-20美元=10美元/月。
- 在下一笔交易发生之前,您可以假设客户正在支付他/她在上一笔交易中支付的金额。例如,如果最新的事务是在计划11-->上升级的,我们可以假设客户当前在计划11上仍然处于活动状态
我们要计算截至2018年1月1日每个客户的累计付款mrr。
输入:
+-------------+-------------------+------------+
| Customer_ID | Txn_date | MRR_Change |
+-------------+-------------------+------------+
| 190290 | 01 April 2016 | 260 |
| 190290 | 01 May 2016 | 31 |
| 190290 | 01 July 2016 | -76 |
| 190290 | 01 September 2016 | 260 |
| 190290 | 01 October 2016 | -260 |
+-------------+-------------------+------------+
输出:
+-------------+-----------------------+
| Customer_ID | Cumulative_Paying_MRR |
+-------------+-----------------------+
| 190290 | $ 4,972 |
+-------------+-----------------------+
4条答案
按热度按时间kcwpcxri1#
您可以按客户id分组,对相关交易日期的change列求和。
避免编写sql,因为这与家庭作业非常相似。
plupiseo2#
欢迎来到mysql on so!
@混乱正指引着你正确的方向,但答案有点不完整。
仅仅总结这些变化是不够的。你需要知道有多少笔交易是用这个金额过账的。从您提供的数据来看,这并非微不足道。
对于每次更改,您需要知道自该日期以来已支付了多少笔款项,然后将更改乘以付款次数,并将此金额相加。
你怎么知道付款的次数?假设每月有一次付款,那么您需要计算结束日期和更改日期之间的月数。您可以使用mysql函数period_diff来实现这一点,但是您需要将参数转换为正确的格式,因为它不需要日期。如果列txndate实际上是一个日期,那么可以使用date\u format函数以所需的格式创建参数。如果不是日期,则必须先将其转换为日期,然后才能使用date\ format函数,或者可以直接转换为period\ diff所需的格式。
注意period_diff给出了两个日期之间的时段数。如果您想同时包含这两个(这似乎是您所需要的),您需要在结果中添加1。
所以你需要这样的东西:
很明显,您需要为period_diff函数指定适当的参数,当然,我不能保证没有输入错误!
这足以让你找到正确的答案,
kxxlusnw3#
在sql中计算累积和(有时称为“滚动和”)的最佳方法是使用窗口函数:
这个例子来自presto,它为每一行计算从表开始到当前行的总和。有很多细节,但这是基本的。
很多网站都有解释,比如这一个,还有更多。。
bwleehnv4#
请在下面找到解决方案: