ウェブベースのアプリの使用状況を分析しようとしています。次の列のメールアドレスの活動日を含むテーブルがあります
この質問に答えるクエリを作成したいと思います: 過去 180 日間の各日について、ALSO で 60 ~ 30 日前にアクティビティを行った人のうち、30 ~ 0 日前にアクティビティを行った人の数。
過去 180 日間 (1 日 1 行の日付テーブルを使用) を文字通りループするストアド プロシージャとして既にこれが機能していますが、180 のクエリを実行しているため、これは少し遅いです。
また、IN句を使用した1つのクエリでそれを実行しようとしましたが、完了するまでに約5分かかりました(テーブルには合計約2,000行しかないため、最適化されていないと推測しています)
最適化された 1 つのクエリ (またはストアド プロシージャ) でこれを行うにはどうすればよいでしょうか?
役立つ場合は、現在のストアド プロシージャ (動作しますが遅い) を次に示します。
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;;
ありがとう!