with o as (
    select order_id,courier_id,zone_id,date_format(delivered_time,'%Y%m') d_f ,timestampdiff(minute,order_time,delivered_time) t_d
    from Orders 
    where ((hour(order_time) between 11 and 13) 
    or (hour(order_time) between 18 and 20))
    and status='delivered'
    ),
a as (
    select o.zone_id,c.courier_id,courier_name,count(1) c_c,rank() over(partition by o.zone_id order by count(1) desc,c.courier_id asc ) r
    from Couriers c 
    inner join o on c.courier_id = o.courier_id
    inner join Zones on Zones.zone_id = o.zone_id
    where d_f=202402
    group by o.zone_id,c.courier_id
)

select z.zone_id,
    zone_name,
    sum(if(d_f=202302,1,0)) peak_2023_02_delivered,
    sum(if(d_f=202402,1,0)) peak_2024_02_delivered,
    sum(if(d_f=202401,1,0)) peak_2024_01_delivered,
    sum(if(d_f=202402,1,0))-sum(if(d_f=202302,1,0)) yoy_delta,
    sum(if(d_f=202402,1,0))-sum(if(d_f=202401,1,0)) mom_delta,
    round(sum(if(d_f=202402,t_d,0))/sum(if(d_f=202402,1,0)),2) avg_peak_minutes_2024_02,
    max(courier_name) top_courier_2024_02
from  o
inner join Zones z
on o.zone_id = z.zone_id
inner join a 
on a.zone_id = z.zone_id and r=1
group by z.zone_id,zone_name
order by z.zone_id