-- t1:总表
WITH t1 AS (
SELECT z.zone_id,
z.zone_name,
z.zone_type,
o.order_time,
o.delivered_time,
o.status,
o.fee,
c.courier_id,
c.courier_name,
c.grade
FROM Zones z
LEFT JOIN Orders o ON o.zone_id = z.zone_id
LEFT JOIN Couriers c ON c.courier_id = o.courier_id
WHERE (HOUR(o.order_time) BETWEEN 11 AND 13 OR HOUR(o.order_time) BETWEEN 18 AND 20)
AND o.status='delivered'
),
-- 计算该商圈送达订单数最多的骑手姓名
-- step1:计算送达订单数
t2 AS (
SELECT zone_id,
courier_id,
courier_name,
count(*)AS cnt
FROM t1
WHERE DATE_FORMAT(order_time, '%Y-%m') = '2024-02'
GROUP BY zone_id,courier_id,courier_name
),
-- step2:计算排名情况
t3 AS (
SELECT zone_id,
courier_name,
ROW_NUMBER()OVER(
PARTITION BY zone_id
ORDER BY cnt DESC,courier_id ASC)AS rn
FROM t2
),
-- step3:筛选送达订单最多的骑手
t4 AS (
SELECT zone_id,courier_name
FROM t3
WHERE rn = 1
)
SELECT t1.zone_id,
t1.zone_name,
COUNT(CASE
WHEN DATE_FORMAT(t1.order_time,'%Y-%m') = '2023-02' THEN t1.order_time
END) AS peak_2023_02_delivered,
COUNT(CASE
WHEN DATE_FORMAT(t1.order_time,'%Y-%m') = '2024-02' THEN t1.order_time
END) AS peak_2024_02_delivered,
COUNT(CASE
WHEN DATE_FORMAT(t1.order_time,'%Y-%m') = '2024-01' THEN t1.order_time
END) AS peak_2024_01_delivered,
COUNT(CASE
WHEN DATE_FORMAT(t1.order_time,'%Y-%m') = '2024-02' THEN t1.order_time
END) - COUNT(CASE
WHEN DATE_FORMAT(t1.order_time,'%Y-%m') = '2023-02'
THEN t1.order_time
END) AS yoy_delta,
COUNT(CASE
WHEN DATE_FORMAT(t1.order_time,'%Y-%m') = '2024-02' THEN t1.order_time
END) - COUNT(CASE
WHEN DATE_FORMAT(t1.order_time,'%Y-%m') = '2024-01'
THEN t1.order_time
END) AS mom_delta,
ROUND(avg(CASE
WHEN DATE_FORMAT(t1.order_time,'%Y-%m') = '2024-02'
THEN TIMESTAMPDIFF(MINUTE,t1.order_time,t1.delivered_time)
END),2) AS avg_peak_minutes_2024_02,
t4.courier_name AS top_courier_2024_02
FROM t1
LEFT JOIN t4 ON t1.zone_id = t4.zone_id
GROUP BY t1.zone_id,t1.zone_name,t4.courier_name
ORDER BY t1.zone_id