with
tmp as (
select
t1.zone_id,
t1.zone_name,
date_format(order_time, '%Y-%m') order_time,
avg(TIMESTAMPDIFF(MINUTE, order_time, delivered_time)) as delivered_time,
count(order_id) as order_num
FROM
Zones t1,
Couriers t2,
Orders t3
where
t1.zone_id = t3.zone_id
and t2.courier_id = t3.courier_id
and status = 'delivered'
and (
HOUR(order_time) BETWEEN 11 AND 13
OR HOUR(order_time) BETWEEN 18 AND 20
)
and date_format(order_time, '%Y-%m') in ('2024-02', '2024-01', '2023-02')
group by
t1.zone_id,
t1.zone_name,
date_format(order_time, '%Y-%m')
),
tmp2 as (
SELECT
zone_name,
courier_name
FROM
(
SELECT
zone_name,
courier_name,
row_number() over (
partition by
zone_name
order by
o_num desc,
zone_id
) as rk
FROM
(
SELECT
zone_name,
t1.zone_id,
courier_name,
count(order_id) as o_num
FROM
Zones t1,
Couriers t2,
Orders t3
where
t1.zone_id = t3.zone_id
and t2.courier_id = t3.courier_id
and status = 'delivered'
and (
HOUR(order_time) BETWEEN 11 AND 13
OR HOUR(order_time) BETWEEN 18 AND 20
)
and date_format(order_time, '%Y-%m') in ('2024-02')
group by
zone_name,
courier_name,
t1.zone_id
) a
) b
where
rk = 1
),
tmp3 as (
SELECT
zone_id,
zone_name,
max(
case
when order_time = '2023-02' then order_num
else 0
end
) peak_2023_02_deliv,
max(
case
when order_time = '2024-02' then order_num
else 0
end
) peak_2024_02_deliv,
max(
case
when order_time = '2024-01' then order_num
else 0
end
) peak_2024_01_deliv,
round(
max(
case
when order_time = '2024-02' then delivered_time
else 0
end
),
2
) avg_peak_minutes_2024_02
FROM
tmp
group by
zone_id,
zone_name
)
SELECT
t2.zone_id,
t2.zone_name,
peak_2023_02_deliv as peak_2023_02_delivered,
peak_2024_02_deliv as peak_2024_02_delivered,
peak_2024_01_deliv as peak_2024_01_delivered,
peak_2024_02_deliv - peak_2023_02_deliv as yoy_delta,
peak_2024_02_deliv - peak_2024_01_deliv as mom_delta,
avg_peak_minutes_2024_02,
t1.courier_name as top_courier_2024_02
FROM
tmp2 t1,
tmp3 t2
where
t1.zone_name = t2.zone_name
order by
t2.zone_id,
t2.zone_name