Sql 如何从事务数据创建客户流失表?
目前我的交易表中有客户每月的交易数据。Account_ID标识客户的ID。Order_ID是客户已下的订单数。报告周开始日期是指从周一开始进行每笔交易的一周(购买日期) 如何在每次交易完成后创建一个新表来标识客户状态?请注意,尽管未进行任何交易,但新表的报告周开始日期一直到当前日期 客户状况Sql 如何从事务数据创建客户流失表?,sql,google-bigquery,lag,lead,churn,Sql,Google Bigquery,Lag,Lead,Churn,目前我的交易表中有客户每月的交易数据。Account_ID标识客户的ID。Order_ID是客户已下的订单数。报告周开始日期是指从周一开始进行每笔交易的一周(购买日期) 如何在每次交易完成后创建一个新表来标识客户状态?请注意,尽管未进行任何交易,但新表的报告周开始日期一直到当前日期 客户状况 - New : customers who made their first paid subscription - Recurring : customers with continuous payme
- 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
我认为您只需要窗口函数和
case
逻辑。假设您所指的日期是报告周开始日期,那么逻辑如下:
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;
选择t.*,
(报告周开始日期=min(报告周开始日期)超过(按帐户id划分)时的情况)
然后是“新的”
当报告周开始日期<日期添加(滞后(报告周开始日期)超过(按账户划分,按报告周开始日期排序),间隔1个月)
然后“重复”
当报告周开始日期<日期添加(lead(报告周开始日期)超过(按账户划分,按报告周开始日期排序),间隔-1个月)
然后“搅动”
否则“重新激活”
结束)作为状态
来自交易t;
这些不完全是您指定的规则。但是他们似乎对你想做的事情有很合理的解释。这是家庭作业/学习作业吗?到目前为止,您尝试了什么?您的数据中有三个日期。我们完全不清楚这些数据与您指定的规则有什么关系。客户状态(超前和滞后)实际上是与购买日期进行比较的,而不是报告周开始日期。报告周开始日期用于在新表中创建记录-从购买数据的第一个报告周开始日期到当前日期的最后一个报告周开始日期。比如队列分析。还有一条规则-每个订单id必须具有相同的客户状态。订单id更改时客户状态更改(下一笔交易)