with conv_cnt as (
    select
        c.campaign_id,
        sum(
            case
            when date_format(event_time, '%Y-%m') = '2023-02' then 1
            else 0
            end
        ) as conv_2023_02,
        sum(
            case
            when date_format(event_time, '%Y-%m') = '2024-02' then 1
            else 0
            end
        ) as conv_2024_02,
        sum(
            case
            when date_format(event_time, '%Y-%m') = '2024-01' then 1
            else 0
            end
        ) as conv_2024_01
    from Campaigns c 
    left join Events e on c.campaign_id=e.campaign_id
    where event_type = 'signup'
    group by c.campaign_id
),
# 2023 年各区域注册占比 = 该区域注册数/该活动总的注册数
pct_data as(
    select
        campaign_id,
        max(north_pct_2023) as north_pct_2023,
        max(south_pct_2023) as south_pct_2023,
        max(east_pct_2023) as east_pct_2023
    from (
        select
            campaign_id,
            round(ifnull((
                case
                when region = '华北' then region_ratio
                else null
                end
            ),0),2) as north_pct_2023,
            round(ifnull((
                case
                when region = '华南' then region_ratio
                else null
                end
            ),0),2) as south_pct_2023,
            round(ifnull((
                case
                when region = '华东' then region_ratio
                else null
                end
            ),0),2) as east_pct_2023
        from (
            select
                campaign_id,
                region,
                round(ifnull((count(event_id) over(partition by campaign_id, region))*100/count(event_id) over(partition by campaign_id),0),2) as region_ratio
            from Events e 
            join Users u on e.user_id=u.user_id
            where year(event_time) = 2023 and event_type = 'signup'
        )as t1
    )as t2
    group by campaign_id
),
max_click as (
    select
        campaign_id,
        user_id,
        max(event_time) as max_click_time
    from Events
    where event_type = 'click'
    group by campaign_id, user_id
),
max_signup as(
    select
        campaign_id,
        user_id,
        max(event_time) as max_signup_time
    from Events
    where event_type = 'signup'
    group by campaign_id, user_id
),
avg_data as (
    select
        campaign_id,
        round(sum(diff_time)/count(distinct user_id),2) as avg_click_to_signup_min_2024_02
    from(
        select
            mc.campaign_id,
            mc.user_id,
            timestampdiff(minute,max_click_time,max_signup_time) as diff_time
        from max_click mc
        left join max_signup ms on mc.campaign_id=ms.campaign_id and mc.user_id=ms.user_id
        where max_click_time <= max_signup_time
    )as t1
    group by campaign_id
),
-- 强制转换字符类型,channel字段为枚举类型,无法升序排列
top_channel as (
    select
        campaign_id,
        device as top_channel_2024_02
    from (
        select
            campaign_id,
            device,
            row_number() over(partition by campaign_id order by device_cnt desc, cast(device as char) asc) as rk 
        from (
            select
                campaign_id,
                device,
                count(*) as device_cnt
            from Events e 
            left join Users u on e.user_id = u.user_id
            where date_format(event_time, '%Y-%m') = '2024-02' and event_type = 'signup'
            group by campaign_id, device
        )as t1
    )as t2
    where rk = 1
)
select
    c.campaign_id,
    campaign_name,
    ifnull(conv_2023_02, 0) as conv_2023_02,
    ifnull(conv_2024_02, 0) as conv_2024_02,
    ifnull(conv_2024_01, 0) as conv_2024_01,
    ifnull(conv_2024_02 - conv_2023_02, 0) as yoy_delta,
    ifnull(conv_2024_02 - conv_2024_01, 0) as mom_delta,
    ifnull(north_pct_2023, 0) as north_pct_2023,
    ifnull(south_pct_2023, 0) as south_pct_2023,
    ifnull(east_pct_2023, 0) as east_pct_2023,
    ifnull(avg_click_to_signup_min_2024_02, 0) as avg_click_to_signup_min_2024_02,
    ifnull(top_channel_2024_02, 0) as top_channel_2024_02
from Campaigns c 
left join conv_cnt on c.campaign_id=conv_cnt.campaign_id
left join pct_data on c.campaign_id=pct_data.campaign_id
left join avg_data on c.campaign_id=avg_data.campaign_id
left join top_channel on c.campaign_id=top_channel.campaign_id
order by c.campaign_id asc, campaign_name asc