题解 | 统计骑手信息

统计骑手信息

https://www.nowcoder.com/practice/704de2445ed943c6bf65cfd77bd69ff4

WITH t1 AS (
SELECT Z.zone_id,zone_name,
       COUNT(IF(DATE_FORMAT(order_time,"%Y-%m")='2023-02',order_id,NULL)) AS peak_2023_02_delivered,
       COUNT(IF(DATE_FORMAT(order_time,"%Y-%m")='2024-02',order_id,NULL)) AS peak_2024_02_delivered,
       COUNT(IF(DATE_FORMAT(order_time,"%Y-%m")='2024-01',order_id,NULL)) AS peak_2024_01_delivered,
       COUNT(IF(DATE_FORMAT(order_time,"%Y-%m")='2024-02',order_id,NULL))-COUNT(IF(DATE_FORMAT(order_time,"%Y-%m")='2023-02',order_id,NULL))  AS yoy_delta,
       COUNT(IF(DATE_FORMAT(order_time,"%Y-%m")='2024-02',order_id,NULL))-COUNT(IF(DATE_FORMAT(order_time,"%Y-%m")='2024-01',order_id,NULL)) AS mom_delta,
       ROUND(AVG(CASE WHEN DATE_FORMAT(order_time,"%Y-%m")='2024-02' THEN TIMESTAMPDIFF(MINUTE, order_time, delivered_time) END),2) AS avg_peak_minutes_2024_02
FROM Zones Z 
LEFT JOIN Orders O ON Z.zone_id=O.zone_id
LEFT JOIN Couriers C ON O.courier_id=C.courier_id
WHERE (HOUR(order_time) BETWEEN 11 AND 13 OR HOUR(order_time) BETWEEN 18 AND 20) AND status='delivered'
GROUP BY Z.zone_id,zone_name
),
t2 AS (
    SELECT Z.zone_id,zone_name,C.courier_id,courier_name,
           COUNT(IF(DATE_FORMAT(order_time,"%Y-%m")='2024-02',order_id,NULL)) AS cnt
    FROM Zones Z 
    LEFT JOIN Orders O ON Z.zone_id=O.zone_id
    LEFT JOIN Couriers C ON O.courier_id=C.courier_id
    WHERE (HOUR(order_time) BETWEEN 11 AND 13 OR HOUR(order_time) BETWEEN 18 AND 20) AND status='delivered'
    GROUP BY Z.zone_id,zone_name,C.courier_id,courier_name
),
t3 AS (
    SELECT zone_id,zone_name,courier_id,courier_name,
           ROW_NUMBER() OVER(PARTITION BY zone_id ORDER BY cnt DESC,courier_id ASC) AS rnk
    FROM t2
),
t4 AS (
    SELECT zone_id,zone_name,courier_id,courier_name
    FROM t3 
    WHERE rnk=1
)
SELECT t1.*,t4.courier_name AS top_courier_2024_02
FROM t1
LEFT JOIN t4  ON t1.zone_id=t4.zone_id
ORDER BY zone_id

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务