WITH t1 AS (
SELECT C.campaign_id,
campaign_name,
COUNT(CASE WHEN DATE_FORMAT(event_time,'%Y-%m')='2023-02' THEN event_id END) AS conv_2023_02,
COUNT(CASE WHEN DATE_FORMAT(event_time,'%Y-%m')='2024-02' THEN event_id END) AS conv_2024_02,
COUNT(CASE WHEN DATE_FORMAT(event_time,'%Y-%m')='2024-01' THEN event_id END) AS conv_2024_01,
COUNT(CASE WHEN DATE_FORMAT(event_time,'%Y-%m')='2024-02' THEN event_id END)-COUNT(CASE WHEN DATE_FORMAT(event_time,'%Y-%m')='2023-02' THEN event_id END) AS yoy_delta,
COUNT(CASE WHEN DATE_FORMAT(event_time,'%Y-%m')='2024-02' THEN event_id END)-COUNT(CASE WHEN DATE_FORMAT(event_time,'%Y-%m')='2024-01' THEN event_id END) AS mom_delta,
ROUND(IFNULL(COUNT(CASE WHEN DATE_FORMAT(event_time,'%Y-%m')='2023-02' AND region='华北' THEN event_id END)/COUNT(CASE WHEN DATE_FORMAT(event_time,'%Y-%m')='2023-02' THEN event_id END)*100,0),2) AS north_pct_2023 ,
ROUND(IFNULL(COUNT(CASE WHEN DATE_FORMAT(event_time,'%Y-%m')='2023-02' AND region='华南' THEN event_id END)/COUNT(CASE WHEN DATE_FORMAT(event_time,'%Y-%m')='2023-02' THEN event_id END)*100,0),2) AS south_pct_2023,
ROUND(IFNULL(COUNT(CASE WHEN DATE_FORMAT(event_time,'%Y-%m')='2023-02' AND region='华东' THEN event_id END)/COUNT(CASE WHEN DATE_FORMAT(event_time,'%Y-%m')='2023-02' THEN event_id END)*100,0),2) AS east_pct_2023
FROM Campaigns C
LEFT JOIN Events E ON C.campaign_id=E.campaign_id
LEFT JOIN Users U ON E.user_id=U.user_id
WHERE event_type='signup'
GROUP BY C.campaign_id,campaign_name
),
t2 AS (
SELECT e1.campaign_id,
ROUND(AVG(TIMESTAMPDIFF(MINUTE,click_time,signup_time)),2) AS avg_click_to_signup_min_2024_02
FROM (
SELECT campaign_id,user_id,MAX(event_time) AS click_time
FROM Events
WHERE event_type='click' AND DATE_FORMAT(event_time,'%Y-%m')='2024-02'
GROUP BY campaign_id,user_id
) e1
LEFT JOIN (
SELECT campaign_id,user_id,MIN(event_time) AS signup_time
FROM Events
WHERE event_type='signup' AND DATE_FORMAT(event_time,'%Y-%m')='2024-02'
GROUP BY campaign_id,user_id
) e2 USING(campaign_id,user_id)
WHERE e1.click_time IS NOT NULL AND e1.click_time<e2.signup_time
GROUP BY e1.campaign_id
),
t3 AS (
SELECT campaign_id,
channel,
ROW_NUMBER() OVER(PARTITION BY campaign_id ORDER BY COUNT(event_id) DESC,CASE channel
WHEN 'app' THEN 1
WHEN 'mini' THEN 2
WHEN 'web' THEN 3
END ASC) AS channel_rnk
FROM Events
WHERE event_type='signup' AND DATE_FORMAT(event_time,'%Y-%m')='2024-02'
GROUP BY campaign_id,channel
),
t4 AS (
SELECT campaign_id,
channel
FROM t3
WHERE channel_rnk=1
)
SELECT t1.*,
t2.avg_click_to_signup_min_2024_02,
t4.channel AS top_channel_2024_02
FROM t1
LEFT JOIN t2 ON t1.campaign_id=t2.campaign_id
LEFT JOIN t4 ON t1.campaign_id=t4.campaign_id
ORDER BY t1.campaign_id,t1.campaign_name