Как рассчитать накопительный MRR оплаты, используя SQL? - PullRequest
0 голосов
/ 13 июля 2020

У меня есть таблица, содержащая следующие данные:

Customer_ID | Дата | MRR_Change

MRR_Change - это приращение дохода в подписке клиента по сравнению с предыдущей транзакцией. Итак, если клиент покупает план за 20 долларов в месяц. а затем обновляется до плана, который составляет 30 долларов в месяц, MRR_change для этой транзакции будет 30-20 долларов = 10 долларов в месяц.

* Пока не произойдет следующая транзакция, вы можете предположить, что клиент платит столько, сколько он / она производила оплату по последней транзакции. Например, если последней транзакцией было «Обновление» по плану 11 -> мы можем предположить, что клиент в настоящее время активен по плану 11

Мы хотим рассчитать совокупный MRR оплаты для каждого клиента по состоянию на 01/01 / 2018.

Ввод:

+-------------+-------------------+------------+
| 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 ]

0 голосов
/ 13 июля 2020

Найдите решение ниже:

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
0 голосов
/ 13 июля 2020

Добро пожаловать в mysql на SO!

@ 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, и, конечно, я не могу гарантировать отсутствие опечаток!

Этого должно быть достаточно, чтобы указать вам правильный ответ,

0 голосов
/ 13 июля 2020

Лучший способ вычислить совокупную сумму (иногда называемую «скользящей суммой») в 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, для каждой строки вычисляется сумма от начала таблицы до текущей строки. Есть много подробностей о глубине, но это основная c.

На многих сайтах есть объяснения, например этот и многие многие другие ..

0 голосов
/ 13 июля 2020

Вы суммируете столбец изменений по состоянию на дату транзакции, с которой вы связаны, сгруппировав по идентификатору клиента.

Воздержитесь от записи SQL из-за того, насколько это сильно напоминает домашнее задание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...