【问题标题】:How to Calculate Cumulative paying MRR using SQL?如何使用 SQL 计算累计支付 MRR?
【发布时间】:2020-11-02 19:44:27
【问题描述】:

我有一个包含以下数据的表格:

客户 ID |日期 | MRR_Change

MRR_Change 是客户订阅中相对于先前交易的增量收入变化。因此,如果客户以 20 美元/月的价格购买计划。然后升级到 30 美元/月的计划。此交易的 MRR_change 将为 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,972 美元的。
  • @GordonLinoff-我再次改写了这个问题。请找到更新后的问题,让我知道如何解决这个问题?
  • 你用的是mysql最新版本吗?
  • 是否有客户190290的完整数据可以计算$4972?
  • @jfrd 这是我拥有的唯一数据。 MRR_Change 是由于订阅计划的变化而导致的价值变化。此外,在下一笔交易发生之前,您可以假设客户支付他/她支付的最后一笔交易的费用。例如,如果客户在 2016 年 10 月支付了 215 美元,那么用户将继续支付相同的金额,直到 2017 年 12 月。因为我们需要计算客户在 12 月 17 日之前支付的累计金额

标签: mysql sql database date group-by


【解决方案1】:

您可以对您关注的交易日期的变化列进行汇总,并按客户 ID 分组。

避免编写 SQL,因为这非常类似于家庭作业。

【讨论】:

    【解决方案2】:

    欢迎来到 mysql 上!

    @chaos 为您指明了正确的方向,但答案有些不完整。

    仅仅总结变化是不够的。您需要知道该金额已过帐多少交易。从您提供的数据来看,这不是微不足道的。

    对于每次更改,您需要知道自该日期以来已经进行了多少次付款,然后您将更改乘以付款次数,然后将这个金额相加。

    您如何找到付款次数?假设每月有一笔付款,那么您需要计算结束日期和更改日期之间的月数。您可以为此使用 MySQL 函数 PERIOD_DIFF - 但您需要将参数转换为正确的格式,因为它不需要日期。如果您的 TxnDate 列实际上是一个日期,那么您可以使用 DATE_FORMAT 函数以您需要的格式创建参数。如果不是日期,则必须先将其转换为日期,然后才能使用 DATE_FORMAT 函数,或者您可以直接转换为 PERIOD_DIFF 所需的格式。

    请注意,PERIOD_DIFF 为您提供两个日期之间的句点数。如果您想同时包含两者(这似乎是您所需要的),您需要在结果中添加 1。

    所以你需要这样的东西:

    SELECT Customer_ID, SUM((PERIOD_DIFF(<arg1>, <arg2>)+1)*MRR_Change)
      FROM <TableName> GROUP BY Customer_ID
    

    显然您需要为 PERIOD_DIFF 函数指定适当的参数,当然我不能保证没有错字!

    这应该足以为您指出正确的答案,

    【讨论】:

      【解决方案3】:

      在 SQL 中计算累积和(有时称为“滚动和”)的最佳方法是使用窗口函数:

      WITH t1 (date,count_events) AS 
        ( SELECT * FROM  (VALUES  ('2020-01-10',3),('2020-01-11',4),('2020-01-13',1),('2020-01-17',2),('2020-01-22',5))) 
      SELECT *, sum(count_events) over (order by date) cumulative_sum
      FROM t1
      ORDER BY date
      

      Results
      date        count_events    cumulative_sum
      2020-01-10  3               3
      2020-01-11  4               7
      2020-01-13  1               8
      2020-01-17  2               10
      2020-01-22  5               15
      

      这个例子来自 Presto,对于每一行它计算表格开头到当前行的总和形式。有很多深度细节,但这是基本的。

      许多网站都有解释,例如this one 等等……

      【讨论】:

        【解决方案4】:

        请在下面找到解决方案:

        DECLARE @FromDate DATETIME, @ToDate DATETIME;
        SET @FromDate = '2015-01-01';
        SET @ToDate = '2018-12-31';
        
        ;with date_dimension as( 
        SELECT TOP (DATEDIFF(MONTH, @FromDate, @ToDate)+1) 
          TheDate  = DATEADD(MONTH, number, @FromDate)
          FROM [master].dbo.spt_values 
          WHERE [type] = N'P' ORDER BY number),
        distinct_customer as(
        SELECT DISTINCT Group_ID from Sheet1$),
        date_customer as(
        SELECT * from date_dimension a, distinct_customer b),
        date_customer_mrr as(
        select a.TheDate, a.Group_ID, coalesce(b.MRR_Change,0) as MRR_Change from date_customer a left join Sheet1$ b on a.TheDate = b.Txn_date)
        select a.Group_ID, sum(a.cumulative_paying_mrr) as cumulative_paying_mrr from
        (select Group_ID, sum(MRR_Change) over(order by TheDate asc rows between unbounded preceding and current row) cumulative_paying_mrr  from date_customer_mrr where TheDate < '2018-01-01 00:00:00.000') a
        group by a.Group_ID
        

        【讨论】:

        • 对不起,你确定这是 mysql 查询吗?因为这看起来像 MSSQL 服务器查询?当我在工作台中复制粘贴时,向我显示了许多语法警告,我错过了什么吗?
        猜你喜欢
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-26
        • 1970-01-01
        • 2020-12-17
        • 2017-02-23
        相关资源
        最近更新 更多