sql-server - 查找不同订阅期的客户流失
问题描述
希望有人以前遇到过这个问题并有解决方案。我正在尝试根据订阅期而不是单个订单日期来查找失效的客户。我们将失效定义为在订阅结束后 30 天内未进行购买/续订。一个客户可以同时拥有多个订阅,并且订阅的长度可能会有所不同。我有一个数据集,其中包括客户 ID、订单、订阅开始日期、订阅到期日期以及该订单在客户订单历史记录中的排名,如下所示:
CREATE TABLE #Subscriptions
(CustomerID INT,
Orderid INT,
SubscriptionStart DATE,
SubscriptionEnd DATE,
OrderNumber INT);
INSERT INTO #Subscriptions
VALUES(1, 111111, '2017-01-01', '2017-12-31', 1),
(1, 211111, '2018-01-01', '2019-12-31' ,2),
(1, 311121, '2018-10-01', '2018-10-02', 3),
(1, 451515, '2019-02-01', '2019-02-28', 4),
(2, 158797, '2018-07-01', '2018-07-31', 1),
(2, 287584, '2018-09-01', '2018-12-31', 2),
(2, 387452, '2019-01-01', '2019-01-31', 3),
(3, 187498, '2019-01-01', '2019-02-28', 1),
(3, 284990, '2019-02-01', '2019-02-28', 2),
(4, 184849, '2019-02-01', '2019-02-28', 1)
在此数据集中,客户 2 将在 2018 年 7 月 31 日失效。由于客户 1 订阅了 2017-01-01 - 2017-12-31,然后订阅了从 2018-01-01 开始到 2019-12-31 结束的订阅,即使客户下达了其他订单,他们也不能在该时间段内失效将有资格。
我尝试使用 LEAD() 和 LAG() 进行一些简单的差距计算,但是,由于订阅期的长度可变,其中单个订阅可以跨越多个其他订单,因此我没有成功。最终,我们将使用它来计算大约 500 万条记录的月流失率。
解决方案
您在尝试使用 LEAD() 和 LAG() 时想多了。您只需要 WHERE 子句中的 NOT EXISTS() 函数
在伪代码中:
SELECT...FROM...
WHERE {SubscriptionEnd is at least 30 days in the past}
AND NOT EXISTS(
{A row for the same Customer where the StartDate is 30 days or less after this EndDate}
)
推荐阅读
- c++ - 引用临时文件与指向临时文件及其生命周期的指针
- python - 如何解决django在插入时出现mysql错误
- api - 如何在 swagger api 文档中添加更多参数
- python - 类型 'tensorflow.python.framework.ops.EagerTensor' 没有 len()
- dart - 当与 ScopedDecendentModel 以及自定义模型一起使用时,作用域模型返回一个空列表小部件
- automated-tests - 脚本仅在 ie 浏览器中挂起
- kubernetes - 如何允许非 HTTP 离开 istio 集群/pod
- android - 在 google Maps Android 中知道手机的方向
- android - Android Webview:较小的显示尺寸会破坏布局
- javascript - 在 django html 模板中使用导航栏在 div 中安装 mapbox div