with t1 as (
select
z.zone_id,
z.zone_name,
# 按日期和高峰期进行统计
sum(case when substr(delivered_time, 1, 7) = '2023-02' and (HOUR(order_time) BETWEEN 11 AND 13 OR HOUR(order_time) BETWEEN 18 AND 20) then 1 else 0 end ) as peak_2023_02_delivered,
sum(case when substr(delivered_time, 1, 7) = '2024-02' and (HOUR(order_time) BETWEEN 11 AND 13 OR HOUR(order_time) BETWEEN 18 AND 20) then 1 else 0 end
) as peak_2024_02_delivered,
sum( case when substr(delivered_time, 1, 7) = '2024-01' and (HOUR(order_time) BETWEEN 11 AND 13 OR HOUR(order_time) BETWEEN 18 AND 20) then 1 else 0 end
) as peak_2024_01_delivered,
# 算总的送达时间
sum(case when substr(delivered_time, 1, 7) = '2024-02' and (HOUR(order_time) BETWEEN 11 AND 13 OR HOUR(order_time) BETWEEN 18 AND 20) then timestampdiff(minute,order_time ,delivered_time) else 0 end) as peak_minutes_2024_02
from
Zones z
join Orders o on z.zone_id = o.zone_id
# join Couriers c on c.courier_id = o.courier_id
where status ='delivered'
group by
z.zone_id,
z.zone_name
),
t2 as (
select
z.zone_id,
c.courier_id,
c.courier_name ,
# 商圈内排名 ,count(*)每个骑手在商圈送单数
ROW_NUMBER() over(partition by z.zone_id order by count(*) desc , c.courier_id) as rn
from
Zones z
join Orders o on z.zone_id = o.zone_id
join Couriers c on c.courier_id = o.courier_id
where status ='delivered'
group by
z.zone_id,
c.courier_id,
c.courier_name
)
select
t1.zone_id,
t1.zone_name,
peak_2023_02_delivered,
peak_2024_02_delivered,
peak_2024_01_delivered,
peak_2024_02_delivered-peak_2023_02_delivered as yoy_delta,
peak_2024_02_delivered-peak_2024_01_delivered as mom_delta,
ROUND(peak_minutes_2024_02/peak_2024_02_delivered ,2) as avg_peak_minutes_2024_02,
t2.courier_name as top_courier_2024_02
from t1 join t2 on t1.zone_id=t2.zone_id
where t2.rn=1
两表连接解决问题,一表算商区聚合值,一表算骑手累积送单量。

京公网安备 11010502036488号