Как создать таблицу оттока из данных транзакций? - PullRequest
0 голосов
/ 08 января 2020

В настоящее время моя таблица транзакций содержит данные транзакций клиента за каждый месяц. Account_ID идентифицирует идентификатор клиента. Order_ID - это количество заказов, которые сделал клиент. Reporting_week_start_date - это неделя, которая начинается в понедельник, когда совершается каждая транзакция (Date_Purchased).

Как создать новую таблицу для идентификации customer_status после каждой транзакции? Обратите внимание, что в новой таблице указана дата Reporting_week_start_date до текущей даты, несмотря на то, что транзакции не проводились.

Customer_Status

- New : customers who made their first paid subscription
- Recurring :  customers with continuous payment
- Churned :  when customers' subscriptions had expired and there's no renewal within the next month/same month
- Reactivated : customers who had churned and then returned to re-subscribe

Таблица транзакций

Account_ID  | Order_ID |  Reporting_week_start_date| Date_Purchased | Data_Expired
    001     | 1001     |       31 Dec 2018         |   01 Jan 2019  |    08 Jan 2019
    001     | 1001     |       07 Jan 2019         |   08 Jan 2019  |    15 Jan 2019
    001     | 1001     |       14 Jan 2019         |   15 Jan 2019  |    22 Jan 2019    #Transaction 1
    001     | 1001     |       21 Jan 2019         |   22 Jan 2019  |    29 Jan 2019
    001     | 1001     |       28 Jan 2019         |   29 Jan 2019  |    31 Jan 2019

    001     | 1002     |       28 Jan 2019         |   01 Feb 2019  |    08 Feb 2019
    001     | 1002     |       04 Feb 2019         |   08 Feb 2019  |    15 Feb 2019    #Transaction 2
    001     | 1002     |       11 Feb 2019         |   15 Feb 2019  |    22 Feb 2019
    001     | 1002     |       18 Feb 2019         |   22 Feb 2019  |    28 Feb 2019

    001     | 1003     |       25 Feb 2019         |   01 Mar 2019  |    08 Mar 2019
    001     | 1003     |       04 Mar 2019         |   08 Mar 2019  |    15 Mar 2019
    001     | 1003     |       11 Mar 2019         |   15 Mar 2019  |    22 Mar 2019    #Transaction 3
    001     | 1003     |       18 Mar 2019         |   22 Mar 2019  |    29 Mar 2019
    001     | 1003     |       25 Mar 2019         |   29 Mar 2019  |    31 Mar 2019

    001     | 1004     |       27 May 2019         |   01 Jun 2019  |    08 Jun 2019
    001     | 1004     |       03 Jun 2019         |   08 Jun 2019  |    15 Jun 2019    #Transaction 4
    001     | 1004     |       10 Jun 2019         |   15 Jun 2019  |    22 Jun 2019
    001     | 1004     |       17 Jun 2019         |   22 Jun 2019  |    29 Jun 2019
    001     | 1004     |       24 Jun 2019         |   29 Jun 2019  |    30 Jun 2019

Ожидаемый результат

Account_ID  | Order_ID |  Reporting_week_start_date| Customer_status
    001     | 1001     |       31 Dec 2018         |   New  
    001     | 1001     |       07 Jan 2019         |   New               #Transaction 1
    001     | 1001     |       14 Jan 2019         |   New
    001     | 1001     |       21 Jan 2019         |   New  
    001     | 1001     |       28 Jan 2019         |   New  

    001     | 1002     |       28 Jan 2019         |   Recurring        
    001     | 1002     |       04 Feb 2019         |   Recurring         #Transaction 2
    001     | 1002     |       11 Feb 2019         |   Recurring  
    001     | 1002     |       18 Feb 2019         |   Recurring  

    001     | 1003     |       25 Feb 2019         |   Churned  
    001     | 1003     |       04 Mar 2019         |   Churned           #Transaction 3
    001     | 1003     |       11 Mar 2019         |   Churned      
    001     | 1003     |       18 Mar 2019         |   Churned    
    001     | 1003     |       25 Mar 2019         |   Churned    

    001     |    -     |       1 Apr 2019          |   Churned  
    001     |    -     |       08 Apr 2019         |   Churned    
    001     |    -     |       15 Apr 2019         |   Churned      
    001     |    -     |       22 Apr 2019         |   Churned    
    001     |    -     |       29 Apr 2019         |   Churned

    001     |    -     |       29 Apr 2019         |   Churned  
    001     |    -     |       06 May 2019         |   Churned    
    001     |    -     |       13 May 2019         |   Churned      
    001     |    -     |       20 May 2019         |   Churned    
    001     |    -     |       27 May 2019         |   Churned

    001     | 1004     |       27 May 2019         |   Reactivated  
    001     | 1004     |       03 Jun 2019         |   Reactivated       #Transaction 4
    001     | 1004     |       10 Jun 2019         |   Reactivated  
    001     | 1004     |       17 Jun 2019         |   Reactivated  
    001     | 1004     |       24 Jun 2019         |   Reactivated'
    ...
    ...
    ...
    current date

1 Ответ

0 голосов
/ 08 января 2020

Я думаю, вы просто хотите, чтобы оконные функции и case logi c. Предполагая, что дата, на которую вы ссылаетесь, равна Reporting_week_start_date, логарифм c выглядит примерно так:

select t.*,
       (case when Reporting_week_start_date = min(Reporting_week_start_date) over (partition by account_id)
             then 'New'
             when Reporting_week_start_date < dateadd(lag(Reporting_week_start_date) over (partition by account_id order by Reporting_week_start_date), interval 1 month)
             then 'Recurring'
             when Reporting_week_start_date < dateadd(lead(Reporting_week_start_date) over (partition by account_id order by Reporting_week_start_date), interval -1 month)
             then 'Churned'
             else 'Reactivated'
        end) as status
from transactions t;

Это не точно указанные вами правила. Но они кажутся очень разумным толкованием того, что вы хотите сделать.

...