所以我有一个带有事务表的数据库,该表存储每个事务的唯一 ID#、客户 ID#、日期和其他几个特定于事务的变量。我正在尝试计算客户流失率:
- 在给定的第 x 天,有 # 个活跃客户。
- 从给定日期 x 30 天后,我们失去的活跃客户数量(从最初的 x 天开始)。(所以我试图跟踪没有新交易的确切客户)
- 我希望能够在一年中的每一天运行此查询。
我不知道这是否足够清楚。如果不是,让我尝试改写:在过去的任何一天,我想要一个具有有效订阅的客户 ID 列表(我们的订阅时间为 30 天)然后我想计算有多少这些客户 ID 续订了他们的订阅在接下来的 30 天内。
我已经运行了一些查询,但我所做的一切似乎都非常低效。例如:
//begin pseudo code
SELECT CustomerID
FROM Transaction
WHERE TransactionDate
< @SomeDate - INTERVAL 1 DAY
AND TransactionDate
> @SomeDate - INTERVAL 30 DAY
因此,现在我在 SomeDate 上拥有了那些带有有效订阅的客户 ID(因为 SomeDate 30 天内的任何交易都会有有效订阅),然后我可以使用 SomeDate + 30 天加入一个新的子选择并加入 CustomerID 以获得更新帐户的计数。
我关心的问题是: 1. 效率;我必须为我想要评估的每一天运行这个查询,并且我只会返回(如果我加入)更新的帐户#--所以我必须运行上面的查询,然后是一个带有 join 的查询,对于我想要活跃的每一天#-renewed#。
我更喜欢做的(但显然无法弄清楚如何)是运行一个输出这样的表的单个查询:
|SomeDate | Active Cust# | Renewed w/in 30 # |
----------------------------------------------
| 10/1 | 123 | 115 |
----------------------------------------------
| 10/2 | 127 | 112 |
----------------------------------------------
| 10/3 | 115 | 108 |
----------------------------------------------
关键是续订帐户的数量基于与活动客户的客户 ID # 唯一 ID 的比较。即如果 Bill (ID#2) 和 Jim (ID# 4) 是两个活跃客户,我希望第二个“renewed w/in 30 #”列表反映 Jim 或 Bill 是否续订,而不是 Bobby Joe 在第二阶段。想法?