Рассчитать отток путем агрегирования по диапазону дат в SQL - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь рассчитать показатель оттока по данным, в которых есть customer_id, group, date. Агрегация будет по идентификатору, группе и дате. Формула оттока: (customers in previous cohort - customers in last cohort)/customers in previous cohort

клиенты в предыдущей когорте относятся к когортам за последние 28 дней, клиенты в последней когорте ссылаются на когорты за последние 28 дней

Я не уверен, как их агрегировать по диапазон дат для расчета оттока.

Вот примерные данные, которые я скопировал из SQL Группировка по диапазону дат :

Date        Group    Customer_id
2014-03-01  A         1
2014-04-02  A         2
2014-04-03  A         3
2014-05-04  A         3
2014-05-05  A         6
2015-08-06  A         1
2015-08-07  A         2
2014-08-29  XXXX      2
2014-08-09  XXXX      3
2014-08-10  BB        4
2014-08-11  CCC       3
2015-08-12  CCC       2
2015-03-13  CCC       3
2014-04-14  CCC       5
2014-04-19  CCC       4
2014-08-16  CCC       5
2014-08-17  CCC       3
2014-08-18  XXXX      2
2015-01-10  XXXX      3
2015-01-20  XXXX      4
2014-08-21  XXXX      5
2014-08-22  XXXX      2
2014-01-23  XXXX      3
2014-08-24  XXXX      2
2014-02-25  XXXX      3
2014-08-26  XXXX      2
2014-06-27  XXXX      4
2014-08-28  XXXX      1
2014-08-29  XXXX      1
2015-08-30  XXXX      2
2015-09-31  XXXX      3

Цель - рассчитать отток каждые 28 дней в период с 2014 по 2015 год по формуле, приведенной выше. Итак, это будет агрегирование данных путем свертывания их на 28 дней и расчета оттока по формуле.

Вот что я пытался агрегировать данные по диапазону дат:

SELECT COUNT(distinct customer_id) AS count_ids, Group,
        DATE_SUB(CAST(Date AS DATE), INTERVAL 56 DAY) AS Date_min,
        DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY) AS Date_max
 FROM churn_agg
 GROUP BY count_ids, Group, Date_min, Date_max

Надеюсь, кто-нибудь поможет мне с вычислением агрегации и оттока. Я хочу просто вычесть агрегированные count_ids, чтобы вычесть это из следующего агрегированного count_ids, который происходит через 28 дней. Так что это будет последовательное вычитание одного и того же значения столбца (count_ids). Я не уверен, нужно ли мне использовать скользящее окно или простое агрегирование, чтобы найти отток.

1 Ответ

0 голосов
/ 10 февраля 2020

Как исправлено @jarlh, это не 2015-09-31, а 2015-09-30. Вы можете использовать это для создания календаря на 28 дней:

create table daysby28  (i int, _Date date);
insert into daysby28  (i, _Date)
SELECT i, cast('01-01-2014'as date) + i*INTERVAL '28 day'
from generate_series(0,50) i
order by 1;

После того, как вы используете @jarlh churn_agg создание таблицы, он отправленный с скрипкой, с этим запросом вы получите то, что вы хотите:

with cte as
(
  select count(Customer) as TotalCustomer, Cohort, CohortDateStart From
  (  
    select distinct a.Customer_id as Customer, b.i as Cohort, b._Date as CohortDateStart
    from churn_agg a left join daysby28 b on a._Date >=  b._Date and a._Date <  b._Date + INTERVAL '28 day' 
  ) a
  group by Cohort, CohortDateStart
)
select a.CohortDateStart, 
1.0*(b.TotalCustomer - a.TotalCustomer)/(1.0*b.TotalCustomer) as Churn from cte a
left join cte b on a.cohort > b.cohort
and not exists(select 1 from cte c where c.cohort > b.cohort and c.cohort < a.cohort)
order by 1  

Скрипка всего вместе здесь

...