我正在尝试对我们基于 Web 的应用程序的使用情况进行一些分析。我有一个包含以下列电子邮件地址活动日期的表格
我想创建一个查询来回答这个问题:对于过去 180 天内的每一天,有多少人在 60 到 30 天之前进行了活动,并且在 30 到 0 天之前进行了活动。
我已经把它作为一个存储过程工作,我在过去的 180 天中逐字循环(使用每天 1 行的日期表),但这有点慢,因为我正在执行 180 个查询。
我还尝试使用带有 IN 子句的查询来完成此操作,但完成大约需要 5 分钟(该表总共只有大约 2,000 行,所以我猜它是高度未优化的)
我将如何使用一个优化的查询(甚至是存储过程)来做到这一点?
如果有帮助,这是当前存储的过程(可以工作但速度很慢):
BEGIN
DECLARE mydate DATE;
DECLARE period1 INT;
DECLARE period2 INT;
DECLARE done INT;
DECLARE cur CURSOR FOR SELECT date_value from dim_date order by date_value DESC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
SET done = 0;
OPEN cur;
REPEAT
FETCH cur INTO mydate;
IF NOT done THEN
REPLACE INTO churn (payment_received,period2,period1,churn_name)
select
mydate,
count(distinct(case when (sales.payment_received BETWEEN DATE_SUB(mydate,INTERVAL p2 month) AND DATE_SUB(mydate,INTERVAL p1 month)) then email end)) AS period2,
(
select count(distinct(case when (sales.payment_received BETWEEN DATE_SUB(mydate,INTERVAL p1 month) AND mydate) then email end))
from sales where subscription = 1 AND email in (select email from sales where sales.payment_received BETWEEN DATE_SUB(mydate,INTERVAL p2 month) AND DATE_SUB(mydate,INTERVAL p1 month) )
)
AS period1,
churn_name as cname
from sales
where subscription = 1;
END IF;
UNTIL done END REPEAT;
CLOSE cur;
END;;
谢谢!