with
temp0 as (
select
z.zone_id,
count(*) as peak_2024_02_delivered,
round(
sum(timestampdiff(minute, order_time, delivered_time)) / count(*),
2
) as avg_peak_minutes_2024_02
from
Zones z
inner join Orders o on z.zone_id = o.zone_id
where
year(delivered_time) = 2024
and month(delivered_time) = 2
and (
hour(delivered_time) >= 11
and hour(delivered_time) <= 13
or hour(delivered_time) >= 18
and hour(delivered_time) <= 20
)
and status = "delivered"
group by
z.zone_id
),
temp1 as (
select
z.zone_id,
count(*) as peak_2024_01_delivered
from
Zones z
inner join Orders o on z.zone_id = o.zone_id
where
year(delivered_time) = 2024
and month(delivered_time) = 1
and (
hour(delivered_time) >= 11
and hour(delivered_time) <= 13
or hour(delivered_time) >= 18
and hour(delivered_time) <= 20
)
and status = "delivered"
group by
z.zone_id
),
temp2 as (
select
z.zone_id,
count(*) as peak_2023_02_delivered
from
Zones z
inner join Orders o on z.zone_id = o.zone_id
where
year(delivered_time) = 2023
and month(delivered_time) = 2
and (
hour(delivered_time) >= 11
and hour(delivered_time) <= 13
or hour(delivered_time) >= 18
and hour(delivered_time) <= 20
)
and status = "delivered"
group by
z.zone_id
),
temp3 as (
select
z.zone_id,
count(*) as courier_count,
c.courier_name
from
Zones z
inner join Orders o on z.zone_id = o.zone_id
inner join Couriers c on c.courier_id = o.courier_id
where
year(delivered_time) = 2024
and month(delivered_time) = 2
and (
hour(delivered_time) >= 11
and hour(delivered_time) <= 13
or hour(delivered_time) >= 18
and hour(delivered_time) <= 20
)
and status = "delivered"
group by
z.zone_id,
c.courier_name
),
temp4 as (
select
zone_id,
row_number() over (
partition by
zone_id
order by
courier_count desc,
Couriers.courier_id asc
) as rk,
temp3.courier_name as top_courier_2024_02
from
temp3
inner join Couriers on temp3.courier_name = Couriers.courier_name
)
select
t0.zone_id,
zone_name,
ifnull(peak_2023_02_delivered, 0) as peak_2023_02_delivered,
peak_2024_02_delivered,
ifnull(peak_2024_01_delivered, 0) as peak_2024_01_delivered,
ifnull(
peak_2024_02_delivered - ifnull(peak_2023_02_delivered, 0),
0
) as yoy_delta,
ifnull(
peak_2024_02_delivered - ifnull(peak_2024_01_delivered, 0),
0
) as mom_delta,
avg_peak_minutes_2024_02,
top_courier_2024_02
from
temp0 t0
left join temp1 t1 on t0.zone_id = t1.zone_id
left join temp2 t2 on t2.zone_id = t0.zone_id
left join temp4 t4 on t4.zone_id = t0.zone_id
inner join Zones z on z.zone_id = t0.zone_id
where
rk = 1
order by
t0.zone_id,
zone_name